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/ выдаётся страница поиска.

Ссылки[править]