Django
Справочник по WEB-фреймворку Django, написанному на python. Уже существует документация и книги для Django, поэтому здесь будет только справочная информация (конфиги, кусочки скриптов).
Начало работы
[править]Установка django
[править]В Mandriva : urpmi python-django
В Fedora и CentOS: yum install Django
В Debian и Ubuntu : sudo apt-get install python-django
В Gentoo : emerge -v dev-python/django
В Arch Linux : sudo pacman -S python-django
В ALT Linux : apt-get install python-module-django
В openSUSE 11.3 посложней: sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/python/openSUSE_11.3/ python
sudo zypper mr -r python
sudo zypper in python-django
В FreeBSD: cd /usr/ports/www/py-django && make install clean
Создание проекта
[править]Проект в django может быть самостоятельным приложением, но в большой степени это просто структура директорий и настройки общие для всех приложений внутри. А приложение — это как раз код, который выполняется.
django-admin.py startproject newproj
, или django-admin startproject newproj
, в зависимости от системы
Создаётся структура вида:
newproj |-- __init__.py - пуст, нужен, чтоб проект воспринимался как [[Учебник Python 3.1#Пакеты|пакет python]] |-- manage.py - обёртка для django-admin.py, отличается тем, что учитывает текущие настройки проекта |-- settings.py - файл настроек для приложений `-- urls.py - описание URL-ов
Создать приложение можно с помощью команды:
python manage.py startapp newapp
Создаётся структура вида:
newproj |-- ... |-- ... `-- newapp - новое приложение |-- __init__.py |-- models.py - описание модели приложения, описываются классы `-- views.py - описывается логика приложения
Запуск проекта
[править]Перед запуском надо записать изменения в базу данных (если она используется):
python manage.py syncdb
Также можно проверить на ошибки:
python manage.py validate
Запустить проект:
python manage.py runserver
Зайти по адресу: "http://127.0.0.1:8000/"
Установка на Web-сервер
[править]Запуск Lighttpd + FastCGI
[править]Система Fedora 10. Софт, который нужен: lighttpd lighttpd-fastcgi django
Установка: yum install django lighttpd lighttpd-fastcgi (Debian: aptitude install lighttpd python-django)
Проект в /tmp/mysite , типичный проект Django с приложением books и шаблонами.
mysite |-- __init__.py |-- books | |-- __init__.py | |-- models.py | |-- views.py |-- manage.py |-- mysite.fcgi |-- settings.py |-- templates | |-- base.html | |-- books | | `-- search.html | `-- mtemp.html |-- urls.py |-- .. `-- views.py
Настройка
[править]Конфигурирация /etc/lighttpd/lighttpd.conf:
# lighttpd configuration file
server.modules= (
...
"mod_fastcgi", #убедиться, что раскомментировали
... )
server.document-root = "/var/www/lighttpd" # тут можно оставить стандартный путь
# и например перенести туда media, css, js, img
...
fastcgi.server = ( "/mysite.fcgi" => # URL на который перенаправляет rewrite-once
( "main" => # имя для status
(
# "host" => "127.0.0.1", # можно и с этими параметрами, например
# "port" => 3033, # если наш проект на другом сервере
"socket" => "/tmp/mysite.sock", # а если на локальной машине, то можно
"check-local" => "disable", # через сокет
)
)
)
url.rewrite-once = (
"^(/media.*)$" => "$1",
"^/favicon\.ico$" => "/media/favicon.ico",
"^(/.*)$" => "/mysite.fcgi$1",
)
Запуск
[править]Запускаем lighttpd
[root@fabrica-35 ~]# /etc/init.d/lighttpd start
Запуск проекта
[mapcuk@fabrica-35 tmp]$ python /tmp/mysite/manage.py runfcgi socket=/tmp/mysite.sock
Проверка
[править]Запустился ли fast-cgi сервер
[mapcuk@fabrica-35 tmp]$ ps ax | fgrep python
5170 ? S 0:00 python ./mysite/manage.py runfcgi socket=/tmp/mysite.sock
5171 ? S 0:00 python ./mysite/manage.py runfcgi socket=/tmp/mysite.sock
...
Внимание файл /tmp/mysite.sock должен быть разрешен для чтения и записи пользователю, от которого запущен lighttpd (обычно тоже lighttpd)
[mapcuk@fabrica-35 tmp]$ ps aux | fgrep lighttpd
lighttpd 4853 0.0 0.1 6584 1124 ? S 11:37 0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
mapcuk 5134 0.0 0.0 4244 704 pts/3 S+ 13:32 0:00 fgrep lighttpd
Проверяем работу приложения
Фрагмент /tmp/mysite/urls.py
...
(r'^search/$', 'mysite.books.views.search'),
...
И /tmp/mysite/books/views.py
...
def search(request):
query = request.GET.get('q', '')
...
return render_to_response("books/search.html", {
"results": results,
"query": query
})
В строку адреса браузера вводим http://127.0.0.1/search/ Должна показаться страница поиска.
Описание процесса
[править]Lighttpd получает запрос от клиента (http://127.0.0.1/search/) отправляет запрос к FastCGI (процессу 'python ./mysite/manage.py runfcgi') через сокет /tmp/mysite.sock, получает ответ и отдаёт клиенту.
Остальные опции можно получить по команде:
[mapcuk@fabrica-35 ~]$ python /tmp/mysite/manage.py help runfcgi
protocol=PROTOCOL fcgi, scgi, ajp, ... (default fcgi)
host=HOSTNAME hostname to listen on..
port=PORTNUM port to listen on.
socket=FILE UNIX socket to listen on.
method=IMPL prefork or threaded (default prefork)
outlog=FILE write stdout to this file.
errlog=FILE write stderr to this file.
Последние 2 параметра удобны для поиска ошибок.
Запуск httpd + mod_python
[править]Конфиг /etc/httpd/conf.d/python.conf который потом вставляется в общий httpd.conf
Надо проверить что в /etc/httpd/conf/httpd.conf есть строчка
Include conf.d/*.conf
Listen 8080 #подслушивать порт 8080
<VirtualHost localhost:8080>
<Location "/django"> #префикс к URL, например localhost:8080/django/search/
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.setup #путь к /tmp/mysite/setup.py тот же settings.py
PythonOption django.root /django # переделывает урлы из localhost:8080/django/search/ в localhost:8080/search/
PythonDebug On
PythonPath "sys.path + ['/tmp']" # это путь к django проектам, а путь к django (/usr/lib/python2.5/site-packages) уже в sys.path
PythonAutoReload Off
</Location>
</VirtualHost>
LoadModule python_module modules/mod_python.so #загрузка модуля mod_python
Можно обращаться по адресу http://localhost:8080/django/search/ выдаётся страница поиска.
Внимание: mod_python морально устарел
Запуск httpd + mod_wsgi
[править]Надо создать файл /tmp/mysite/django.wsgi
#!/usr/bin/env python
import os, sys
sys.path.append('/tmp') #каталог с нашими проектами django
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.setup' #указываем на файл /tmp/mysite/setup.py
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
И конфиг для /etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so
Listen 7080
<VirtualHost localhost:7080>
WSGIScriptAlias / /tmp/mysite/django.wsgi
</VirtualHost>
Проверяем по адресу http://localhost:7080/search/ выдаётся страница поиска.