Как установить Django на виртуальном хостинге

в разделе Администрирование | Метки: Python, Hosting, Django

В последнее время много внимания уделяется различным веб-фреймворкам, в особенности Ruby on Rails, при этом незаслуженно многие забывают о существовании достаточно мощного средства для создания веб-приложений - Django. Среди веб-сайтов, которые используют Django - The Washington Post, Yandex и многие другие. На конференции Российские интернет технологии 2007 в своем выступлении сотрудники Яндекса рассказали о тестировании различных веб-фреймворков, по результатам тесВ последнее время много внимания уделяется различным веб-фреймворкам, в особенности Ruby on Rails, при этом незаслуженно многие забывают о существовании достаточно мощного средства для создания веб-приложений - Django. Среди веб-сайтов, которые используют Django - The Washington Post, Yandex и многие другие. На конференции Российские интернет технологии 2007 в своем выступлении сотрудники Яндекса рассказали о тестировании различных веб-фреймворков, по результатам тестирования наибольшую производительность показал Django.

Установка Django производилась на хостинге компании "Хостинговые телесистемы", это один из немногих хостингов, который поддерживает достаточно большой перечень приложений и баз данных, (см. ссылку справа вверху страницы) и при этом саппорт и админы достаточно адекватные люди и помогают решать различные вопросы, в то время как на других хостингах как правило или не знают что делать или просто говорят что они не поддерживают что-то. При установке Django я руководствовался статьей с wiki хостинг-провайдера Dreamhost, кроме этого мне очень помогли в выявлении причин различных ошибок сотрудники компании "Хостинговые телесистемы" в связи с чем хотелось бы поблагодарить их за это :-) Собственно установка Django: в данном случае предпложим что

  • home директория: /home/username/
  • сайт и все доступные извне файлы находятся в каталоге: /home/username/domain.ru
  • media файлы мы будем хранить в каталоге: /home/username/media/domain, файлы находящиеся в этом каталоге будут доступны по адресу http://media.domain.ru/ (о том как настроить домен, можно почитать в FAQ)
  • все наши проекты будут храниться в каталоге: /home/username/django_projects/
  • наш тестовый проект будет называться myproject
  • шаблоны будут храниться в каталоге /home/username/django_templates/myproject

Создаем каталог где будем временно хранить файлы для установки django и модулей, и каталог куда мы все это будем устанавливать

$ cd
$ mkdir build python

Скачиваем Django, модуль для работы с PostgreSQL и модуль для работы с FastCGI и устанавливаем их

$ cd build
$ wget http://www.djangoproject.com/download/0.96/tarball/ && wget http://initd.org/pub/software/psycopg/psycopg2-2.0.6.tar.gz && wget http://www.saddi.com/software/flup/dist/flup-0.5.tar.gz
$ tar zxf Django-0.96.tar.gz
$ tar zxf psycopg2-2.0.6.tar.gz
$ tar zxf flup-0.5.tar.gz
$ cd Django-0.96
$ python setup.py install --prefix /home/username/python
$ cd ../psycopg2-2.0.6
$ python setup.py install --prefix /home/username/python

после того как они установились в каталоге /home/username/python появятся две папки - bin и lib, в папке bin лежит django-admin.py в папке libs появляется еще несколько папок среди которых /home/username/python/lib/python2.4/site-packages и /home/username/python/lib/python2.4/site-packages/psycopg2

С flup такой метод установки не сработал, поэтому он устанавливается таким образом:

$ cp ~/build/flup-0.5/flup/server/fcgi.py ~/python/lib/python2.4/site-packages/
$ cp -R ~/build/flup-0.5/flup/ ~/python/lib/python2.4/site-packages/flup

Теперь необходимо внести изменения в переменные окружения, я пользуюсь bash поэтому настройки написаны для этого интерпретатора. Редактируем /home/username/.bashrc и добавляем в него следующие строки:

export PATH=$PATH:$HOME/python/bin:$HOME/python/lib/python2.4/site-packages export PYTHONPATH=$PYTHONPATH:$HOME/python/lib/python2.4/site-packages:$HOME/django_projects:

после чего нужно перезагрузить конфиг
$ source .bash_profile

Теперь можно проверить правильно ли все установлено:

$ python
Python 2.4.4 (#2, Jun  6 2007, 17:41:44)
[GCC 3.4.6 [FreeBSD] 20060305] on freebsd6
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('/home/username/python/lib/python2.4/site-packages')
>>> sys.path.append('/home/username/django_projects')
>>> import psycopg2
>>> from fcgi import WSGIServer

на этом этапе никаких ошибок не должно появится. Если копировать код отсюда и вставлять в консоль то может появится пробел в начале строки это вызовет ошибку типа во такой

File "", line 1
import psycopg2
^
SyntaxError: invalid syntax

Django будет работать через FastCGI для включения соответствующих настроек необходимо создать файл /home/username/domain.ru/dispatch.fcgi c таким содержанием:

#!/usr/local/bin/python
 
import sys
sys.path.append('/home/username/python/lib/python2.4/site-packages')
sys.path.append('/home/username/django_projects')
 
 
from fcgi import WSGIServer
from django.core.handlers.wsgi import WSGIHandler
 
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
WSGIServer(WSGIHandler()).run()

после чего выставить ему необходимые для корректной работы права

$ chmod 750 ~/domain.ru/dispatch.fcgi

в файл /home/username/domain.ru/.htaccess необходимо добавить:

Options +ExecCGI
AddHandler fastcgi-script .fcgi
 
RewriteEngine On
RewriteBase /
RewriteRule ^(dispatch\.fcgi/.*)$ - [L]
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L]

Различные media-файлы мы будем хранить в /home/username/media/domain/ кроме этого когда мы работаем в административном интерфейсе Djungo различные media-например css хранятся в отдельной папке, местонахождение которой задается в настройках нашего проекта, речь о которых пойдет ниже. Для того чтобы они были доступны мы создадим symlink на соответствующую директорию в дистрибутиве django:

$ ln -s $HOME/home/username/python/lib/python2.4/site-packages/django/contrib/admin/media/ $HOME/media/myproject/admin_media

Теперь о настройках, для начала нужно создать новый проект, создать папку где мы будем хранить проекты и папку для шаблонов:

$ mkdir ~/django_projects ~/django_templates
$ cd ~/django_projects
$ django-admin.py startproject myproject

После этого появляется папка myproject, в ней редактируем файл /home/username/django_projects/myproject/settings.py я использовал в качестве базы PostgreSQL для MySQL соответсвенно нужно выбрать DATABASE_ENGINE = 'mysql' и DATABASE_PORT = 3306

DATABASE_ENGINE = 'postgresql_psycopg2'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'djungo_db'             # Or path to database file if using sqlite3.
DATABASE_USER = 'djungo_user'             # Not used with sqlite3.
DATABASE_PASSWORD = 'Wk7hhL2I'         # Not used with sqlite3.
DATABASE_HOST = 'database_host'             # Set to empty string for localhost. Not used with sqlite3.

После этого можно запускать синхронизацию с БД, после успешного завершения которой будет предложено создать административный аккаунт:

$ cd ~/django_projects/myproject/
$ python manage.py syncdb
Creating table auth_message
Creating table auth_group
Creating table auth_user
Creating table auth_permission
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
 
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'boris'): someuser
E-mail address: contact@somesite.ru
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model

После этого можно попробовать загрузить страницу http://www.domain.ru/admin/ - все должно работать. ps: в официальном руководстве указано что необходимо запустить свой сервер на время разработки командой python manage.py runserver. Ничего это делать не нужно, административный интерфейс будет и так доступен после выполнения всех перечисленных выше действий.