Архивы по Категориям: man

Запускаем django на nginx

Давным давно, я писал как установить nginx

там же в комментариях подсказали ещё способ

nginx=stable # use nginx=development for latest development version
add-apt-repository ppa:nginx/$nginx
apt-get update
apt-get install nginx

получаем последний nginx.

Напомню, что у меня за nginx стоят разные «бэк-энды»
для самого нагруженного сайта я использую php5-fpm
для остальных сайтов я использую apache2
для Django проектов я использовал Apache2 + mod_python но его прожорливость, давала повод задуматься.

в итоге я искал способ освободить ресурсы занимаемые Индейцем.

Такой способ нашёлся :)

создаю конфигурационный файл хоста nginx.

touch djangosite

у меня они лежат в /etc/nginx/sites-available и уже от туда симлинками идут в /etc/nginx/sites-enabled

Конфигурационный файл такого содержания

server {
listen 80;
server_name sitename.ru www.sitename.ru;

charset utf-8;

access_log /var/log/nginx/sitename-access.log;
error_log /var/log/nginx/sitename-error.log;
client_max_body_size 300m;

# Это, чтоб стили и статические файлы админки подгружались, проверьте у себя,
# в разных версиях Ubuntu могут быть разные версии Питона.
# ну и в настройках джанго проекта разумеется у нас тоже указан ADMIN_MEDIA как media_admin

location /media_admin {
    alias  /usr/lib/python2.5/site-packages/django/contrib/admin/media;
    }
location / {
#Это как пример как мы запускаем джангоСервер
#python ./manage.py runfcgi method=prefork socket=/tmp/sitemane.sock pidfile=/tmp/sitename.pid
# Общаться будем по сокету, хотя можно и по 127.0.0.1:8000
fastcgi_pass   unix:/tmp/sitename.sock;
#Ага и вот этот файлик не забудем создать, о нём ниже
include fastcgi_params_django;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

так же создаём файл

touch /etc/nginx/fastcgi_params_django

и в него вкладываем вот такие параметры

fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_PROTOCOL $server_protocol;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

проверяем верность конфигурации

nginx -t

если всё ОК идём дальше.

проекты джанго у меня лежат в /home/django

Заходим в нужный нам проект и создадим там скрипт сервера.

touch server.sh

Вот с таким содержанием

#!/bin/bash

case "$1" in
"start")
#есть 2 варианта запуска сервера, по сети и через unix сокеты
# последний выигрывает по производительности
#python ./manage.py runfcgi method=prefork host=127.0.0.1 port=8000 pidfile=/tmp/sitename.pid
python ./manage.py runfcgi method=prefork socket=/tmp/sitename.sock pidfile=/tmp/sitename.pid
# не забываем, про то, что сокет у нас мог прочитать фронт-энд
# а nginx  у меня работает с правами www-data
chown www-data:www-data /tmp/sitename.sock
;;
"stop")
kill -9 `cat /tmp/sitemane.pid`
;;
"restart")
$0 stop
sleep 1
$0 start
;;
*) echo "Usage: ./server.sh {start|stop|restart}";;
esac

Вот и весь скрипт, не забываем только поменять sitename на имя вашего сайта, а то получится, что на один pid или сокет у вас будет ссылаться несколько серверов.

чтоб запустить сервер

./server.sh start

А вот он и не запустился ругается на Flup

No module named flup

нам понадобится пакет flup это питоновский пакет, поэтому его я устанавливаю вот так

easy_install flup

Можно попробовать поставить его из репозитория убунты

apt-get install python-flup

Но я так не пробовал ;)

Всё сервер запустился, можно перезапустить nginx для применения новой конфигурации

/etc/init.d/nginx restart

Всё готово, наш сервер запустился.

Теперь по хорошему добавить скрипт запуска сервера в автозагрузку.

squid на два внешних интерфейса

Начал я играться с сервером, у которого два внешних интерфейса, обязательно опишу чуть позже что и как делал, а то факт – забуду.

И так, что надо сделать для Squid чтоб  он использовал оба внешних канала.

Мне нужно было зарулить только определённый набор ИП адресов внутренней сети.

Объявим 2 списка, укажем в каждом диапазон ип адресов, которые куда будем отправлять.

acl provider1 src 10.0.0.0/24
acl provider2 src 16.0.0.0/24

Чуть ниже скажем что нам можно что не можно

http_access allow provider1
http_access allow provider2

И дальше

tcp_outgoing_address 10.1.0.1 provider1
tcp_outgoing_address 10.1.0.2 provider2

10.1.0.1 10.1.0.2 – это внешние адреса сервера с разными интерфейсами.

Собственно всё, после этого всё будет как нам хочется.

Связанные списки select в django (ajax select linked)


Потратив часа 3 на поиск рабочего решения связанных полей (Это когда в зависимости от категории нужно показывать под категорию) спешу поделиться чтоб не забыть

в urls.py

(r'^ajax/categ/$', 'proj.list.views.feeds_subcat'),

во Вьюхе

def feeds_subcat(request):
    from django.core import serializers
    json_subcat = serializers.serialize("json", SubCategory.objects.filter(category_name=request.GET['id']))
    return HttpResponse(json_subcat, mimetype="application/javascript")

Примерно рассказываю что там происходит
В модели SubCategory выбираем имя субкатегории, которая соответствует ид_категории, что к нам привалило.
всё это оборачиваем в JSON попутно подгружаем библиотеки для этих дел.
и отправляем прямо в формате js всё обратно.

теперь создаём ещё один js файл называем его как душе угодно (и не забываем подключить)

<script src="/static/js/categ.js" type="text/javascript"></script>
  $(function(){
    $("select#id_categ").change(function(){
      $.getJSON("/ajax/categ/",{id:+$(this).val()}, function(j) {
        var options = '<option value="">---------- </option>';
        for (var i = 0; i < j.length; i++) {
          options += '<option value="' + parseInt(j[i].pk) + '">' + j[i].fields['name'] + '</option>';
        }
        $("#id_sub").html(options);
        $("#id_sub option:first").attr('selected', 'selected');
        $("#id_sub").attr('disabled', false);
      })
      $("#id_categ").attr('selected', 'selected');
    })
  })

Что он делает?
находит элемент select с id = «id_categ»
При изменении которого вызывает функцию $.getJSON, которая долбится по урле /ajax/categ/ гет запросом и параметром ?id=то_что_выбрано
Если всё отлично выполняется функция j
Которая и меняет значение во втором селекте.
#id_categ – ИД_селекта категории
#id_sub – ИД_селекта подкатегории

django devserver статические файлы ( django devserver static files)

Во время разработки нужно чтоб статика обрабатывалась dev сервером, всякие файлы стилей js и т.п.

Для решения этой задачи я использую вот это:

urls.py

(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/home/django/list/static'}),

в корне проекта создаю каталог static, в котором создаю подкаталоги js images style и т.п

Django ajax пример ( django ajax autocomplite)

Продолжаю понемногу разбираться в Django

Дошло до авто заполнения полей, пару дней перечитывал все «Интернеты» о разных вариантах и методах, о готовых примерах и т.п.

И так начнём я воспользовался jQuery плагином Autocomplete
Всё это я брал вот тут
Плагин совсем не полный ищет так себе похоже просто старый.
Поэтому идём и берём самый новый ..

тут оно будет работать без основного jQuery

Но на других страницах проекта, есть более полные версии и более красивые.
Вот их и качаем
Из них нам нужны
в папочку css кидаем

indicator.gif
jquery.autocomplete.css

в папочку js кидаем

jquery-1.5.min.js
jquery.autocomplete.min.js

Поехали, предположим, что у нас есть в urls.py

(r'^asearch/$', 'man.views.ajax_search'),

man.views.ajax_search – я думаю рассказывать не надо, что это своё приложение и Вьюха его

во views.py

def ajax_search(request):
     if request.method == 'GET':  
         GET = request.GET  
         if GET.has_key('q'):
             q = request.GET.get( 'q' )
             search = Task.objects.all()
             results = search.filter(name__contains = q)
             matches = ""
             for result in results:
                 matches = matches + "%s\n" % (result.name)
             return HttpResponse(matches, mimetype="text/plain")

В данном примере мы будет общаться через обычный get запрос.
Можно сделать «не обычным»
например так

if request.is_ajax():
q = request.GET.get( 'q' )

Но об этом попробую ещё написать, когда буду более тонко в этом разбираться
В модели Task мы делаем поиск по полю «name».
Потом всё это выстраиваем в красивый список с переносами строк
в итоге в переменной matches у нас будет уже структурированный список.

Теперь на стороне клиента.

Во первых подключаем плагин со стилями и jquery

<script src="/static/js/jquery-1.5.min.js" type="text/javascript"></script>
<script src="/static/js/jquery.autocomplete.min.js" type="text/javascript"></script>
<link type="text/css" rel="stylesheet" href="/static/css/jquery.autocomplete.css">

Добавим простую функцию jQ

<script type="text/javascript">
   $(document).ready(function() {  
       $("#q1").autocomplete("/asearch/");  
    });  
</script>

Тут мы говорим плагину: находим элемент с id=»q1″ и будем с ним работать.
А всё запросы отправлять на урл «/asearch/»

дальше собственно сам элемент

<input id="q1" type="text" />

Вот собственно и всё.

Страница 1 из 101234510...Последняя »