Django

Установка Django, PostgreSQL, Nginx на Debian сервере с нуля

Оригинал статьи размещен по адресу http://www.mindinmotion.ru/content/207.html

Решил снова попробовать Django. Некоторое время назад я перевел все сайты что начинал делать на Django на Drupal, либо на самописные решения, созданные с помощью Zend Framework. Тогда я руководствовался тем что надо хорошо знать какой один язык и забросил Python и Django. Сейчас все же решил снова вернутся к Django по нескольким причинам, во первых все таки многие вещи в Django делаются быстрее, ну например те же формы, даже используя Zend Form кода все равно в разы получается больше, особенно если валидаторы присобачивать, фильтры, кастомизировать как будет форма отображаться.

Ну вот как пример, кусок из одной партнерки которую я писал:

  1. $emailValidator = new Zend_Validate_EmailAddress(Zend_Validate_Hostname::ALLOW_DNS, true);
  2.  
  3. $email = new Zend_Form_Element_Text('email');
  4. $email->setLabel('Email')
  5. ->setRequired(true)
  6. ->addFilter('StripTags')
  7. ->addFilter('StringTrim')
  8. ->addValidator($emailValidator)
  9. ->addErrorMessage('Ошибка: Email неправильный.');
  10. $email->setDecorators(array(
  11. 'ViewHelper','Description',
  12. 'Errors',
  13. array(array('data' => 'HtmlTag'), array('tag' => 'td')),
  14. array('Label', array('tag' => 'td')),
  15. array(array('row' => 'HtmlTag'),
  16. array('tag' => 'tr', 'openOnly' => false))
  17. ));

В общем ладно, перехожу к описанию установки Django, в качестве базы решил использовать PostgreSQL, лично для меня пофиг какая база PostgreSQL или MySQL, решил использовать PostgreSQL потому что сами разработчики Django когда разрабатывали свой фреймворк, затачивали его под Postgres.

  1. # aptitude install postgresql

Правим файл /etc/postgresql/8.4/main/postgresql.conf (здесь и дальше по тексту заменяем 8.4 на свою версию), меняем

  1. # listen_addresses = 'localhost'

на

  1. listen_addresses = 'localhost, 192.168.1.10'

В моем случае я прописываю внутренний айпишник сервера - 192.168.1.10

Дальше правим файл /etc/postgresql/8.4/main/pg_hba.conf, находим строку # IPv4 local connections:

добавляем

  1. host all all 192.168.1.1/24 md5

перезапускаем

  1. # /etc/init.d/postgresql-8.4 restart
  2. Restarting PostgreSQL 8.4 database server: main.

Если все сделали правильно Postgres начнет ждать подключений на нужном айпишнике.

  1. # netstat -tanp |grep postgre
  2. tcp 0 0 192.168.1.10:5432 0.0.0.0:* LISTEN 23104/postgres
  3. tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 23104/postgres
  4. tcp6 0 0 ::1:5432 :::* LISTEN 23104/postgres

Создаем нового юзера (в моем примере newuser) и зададим ему пароль qwerty

  1. # su postgres
  2. postgres@srv01:/etc/postgresql/8.4/main$ createuser newuser
  3. Shall the new role be a superuser? (y/n) n
  4. Shall the new role be allowed to create databases? (y/n) n
  5. Shall the new role be allowed to create more new roles? (y/n) n
  6. $ psql template1
  7. psql (8.4.1)
  8. Type "help" for help.
  9.  
  10. template1=# alter user newuser password 'qwerty';
  11. ALTER ROLE

Заодно сменим пароль для пользователя postgres

  1. template1=# ALTER ROLE postgres WITH ENCRYPTED PASSWORD 'my-super-secret-password';
  2. ALTER ROLE
  3. postgres=# \q

Создаем базу для пользователя newuser, на запрос пароля вводим пароль, который мы установили для пользователя postgres (my-super-secret-password)

  1. $ createdb websitedb --owner=newuser -hlocalhost
  2. Password:

Теперь пробуем подключиться с клиентской машины

  1. $ psql -Unewuser -W -hsrv01.lan
  2. Password for user newuser:
  3. psql (8.4.1)
  4. SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
  5. Type "help" for help.
  6.  
  7. newuser=>

С базой покончено, можно настраивать сайт

  1. # mkdir /var/www/yourwebsite
  2. # chown yourusername:yourusername /var/www/yourwebsite

Поясню этот шаг, у меня сервак используется для решения задач по разработке, так что я не ставлю целью сделать подобные проекты секьюрными и решаю вопросы по настройке сайтов исходя из того как мне удобно. Я монтирую директории по ssh и поэтому я меняю вдалельца каталогов на юзера yourusername - это тот юзер, которым я подключаюсь/монтирую по ssh этот проект.

Я использую Django из SVN, то есть самую последнюю версию, и я решил держать ее в той же директории, где будет находиться сайт. Тут есть одна особенность - сервер работает под юзером www-data, так что для директории с django я сменю owner на www-data, и туда же счекаютю последнюю версию Django, перед этим став юзером www-data.

  1. srv01:/var/www/yourwebsite# mkdir django-trunk
  2. srv01:/var/www/yourwebsite# chown www-data:www-data django-trunk/
  3. srv01:/var/www/yourwebsite# su www-data
  4. srv01:~/yourwebsite$ cd django-trunk/
  5. srv01:~/yourwebsite/django-trunk$
  6. $ svn co http://code.djangoproject.com/svn/django/trunk/ .
  7. A LICENSE
  8. A django
  9. A django/test
  10. A django/test/simple.py
  11. A django/test/client.py
  12. A django/test/testcases.py
  13.  
  14. ------------------- >8 вырезано -----------------------------
  15.  
  16. A examples/hello/urls.py
  17. A examples/views.py
  18. A examples/__init__.py
  19. A examples/settings.py
  20. A examples/urls.py
  21. A setup.cfg
  22. U .
  23. Checked out revision 11793.
  24. srv01:~/yourwebsite/django-trunk$ exit
  25. srv01:/var/www/yourwebsite#

Теперь нам надо узнать где находятся site-packages, для этого в консоли (в bash консоли, а не консоли python) надо набрать команду, приведеннуную ниже по тексту, в результате выполнения которой узнаем путь к site-packages.

  1. # python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
  2. /usr/lib/python2.5/site-packages

В процессе установки и написания этой статьи я решил что все таки лучше будет хранить последнюю версию Django в директории /var/www, чтобы каждый раз для каждого нового сайта не прописывать пути и каждый раз не апдейтить одну и ту же версию Django для разных сайтов.
# mv /var/www/yourwebsite/django-trunk /var/www

Далее необходимо сделать так чтобы Python мог загружать код Django, для этого необхоимо сделать symlink. После чего еще один symlink для того чтобы можно было запускать django-admin.py из любой директории.

  1. # ln -s `pwd`/django-trunk/django /usr/lib/python2.5/site-packages/django

Для запуска Django как FastCGI server понадобится flup, который можно установить из пакетов.

  1. # aptitude install python-flup

Создаем новый проект

  1. $ django-admin.py startproject yourproject
  2. boris@srv01:/var/www/yourwebsite$ ls -lha
  3. total 12K
  4. drwxr-xr-x 3 boris boris 4.0K Dec 4 13:55 .
  5. drwxrwxrwx 60 www-data www-data 4.0K Dec 4 00:58 ..
  6. drwxr-xr-x 2 boris boris 4.0K Dec 4 13:55 yourproject
  7. boris@srv01:/var/www/yourwebsite$ ls -lha yourproject/
  8. total 20K
  9. drwxr-xr-x 2 boris boris 4.0K Dec 4 13:55 .
  10. drwxr-xr-x 3 boris boris 4.0K Dec 4 13:55 ..
  11. -rw-r--r-- 1 boris boris 0 Dec 4 13:55 __init__.py
  12. -rwxr-xr-x 1 boris boris 546 Dec 4 13:55 manage.py
  13. -rw-r--r-- 1 boris boris 2.8K Dec 4 13:55 settings.py
  14. -rw-r--r-- 1 boris boris 550 Dec 4 13:55 urls.py

Проект создан, теперь можно запускать FastCGI сервер и настраивать Nginx.

  1. boris@srv01:/var/www/yourwebsite/yourproject$ ./manage.py runfcgi method=threaded host=127.0.0.1 port=3033

Теперь создаем конфиг для nginx /etc/nginx/sites-available/yourwebsite (если не установлен, то устанавливаем командой sudo aptitude install nginx). Ниже содержимое этого файла:

  1. upstream djangoserv {
  2. server 127.0.0.1:3033;
  3. }
  4. server {
  5. listen 80;
  6. server_name yourwebsite;
  7. root /var/www/yourwebsite/yourproject;
  8.  
  9. access_log /var/www/ /logs/access.log;
  10. error_log /var/www/yourwebsite/logs/error.log;
  11.  
  12. location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov) {
  13. access_log off;
  14. expires 30d;
  15. }
  16.  
  17. location / {
  18. fastcgi_pass 127.0.0.1:3033;
  19. fastcgi_param PATH_INFO $fastcgi_script_name;
  20. fastcgi_param REQUEST_METHOD $request_method;
  21. fastcgi_param QUERY_STRING $query_string;
  22. fastcgi_param SERVER_NAME $server_name;
  23. fastcgi_param SERVER_PORT $server_port;
  24. fastcgi_param SERVER_PROTOCOL $server_protocol;
  25. fastcgi_param CONTENT_TYPE $content_type;
  26. fastcgi_param CONTENT_LENGTH $content_length;
  27. fastcgi_pass_header Authorization;
  28. fastcgi_intercept_errors off;
  29. }
  30.  
  31. }

После чего делаем symlink и включаем конфиг для нового виртуал хоста, создаем папку с логами и выставляем ей нужного владельца (www-data), после чего перезагружаем nginx.

  1. srv01:/etc/nginx/sites-available# ln -s /etc/nginx/sites-available/yourwebsite /etc/nginx/sites-enabled/yourwebsite
  2. srv01:/etc/nginx/sites-available# mkdir /var/www/yourwebsite/logs
  3. srv01:/etc/nginx/sites-available# chown www-data:www-data /var/www/yourwebsite/logs
  4. # /etc/init.d/nginx reload
  5. Reloading nginx configuration: the configuration file /etc/nginx/nginx.conf syntax is ok
  6. configuration file /etc/nginx/nginx.conf test is successful
  7. nginx.

Если все сделали правильно теперь можно зайти по адресу http://yourwebsite и увидеть там дефолтную страницу Django с надписью It worked!

Еще по теме:  

Django vs PHP

Примерно год назад я купил один домен и решил сделать подобие каталога на нем и так еще несколько сервисов по мелочи. В феврале я устроился работать веб-программером и забил на все это, потом время от времени я то возвращался к этому "проекту", то опять забрасывал его.

Я поискал несколько уже готовых скриптов для создания каталогов, в том числе и платных и взломанных, все было не тем что мне нужно было. Мне хотелось такой же каталог как Яндекс.Каталог или что-то подобное. Для хранения в базе данных древовидной структуры каталога я взял идею из этой презентации. В общем я написал класс для работы с таким каталогом. Потом меня это быстро все достало, мало того что надо было написать только этот класс, надо было еще написать админку. Кроме всего этого каталог был лишь частью того что мне хотелось создать на этом сайте.

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

После того как я недавно решил что пора завязывать с раздолбайством, сел за написание всего, что хотелось на Django. Большую часть времени (несколько часов) заняло проектирование базы данных, дело в том что планируется достаточно много данных и если криво все спроектировать все рано или поздно начнет тормозить. Под сам каталог таблица получилась такая:

  1. CREATE TABLE `directory_russia` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `parent_id` int(11) NOT NULL,
  4. `path_string` varchar(255) NOT NULL,
  5. `name` varchar(255) NOT NULL,
  6. `depth` int(11) NOT NULL,
  7. `region_id` int(11) NOT NULL,
  8. PRIMARY KEY (`id`),
  9. KEY `directory_russia_region_id` (`region_id`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

models.py в Django

  1. class Russia(models.Model):
  2. parent_id = models.IntegerField()
  3. path_string = models.CharField(maxlength=255)
  4. name = models.CharField(maxlength=255)
  5. depth = models.IntegerField()
  6. region = models.ForeignKey(Region)
  7. def __unicode__(self):
  8. return self.name
  9. class Admin:
  10. pass

в views.py я написал только одну фукнцию которая строит путь от корня каталога, до текущего раздела:
  1. def build_node_path(path):
  2. node_path = []
  3. for node_id in path.rsplit('/'):
  4. node_object = Russia.objects.get(pk=node_id)
  5. node_path.append(<a href='/cat/' + str(node_object.id) + '/>' + node_object.name + '</a>')
  6. return " > ".join(node_path)

в итоге получается путь типа "Раздел-1 > подраздел-1 > подраздел-2"
сами данные для каталога хранятся в другой таблице
  1. class Org(models.Model):
  2. directory = models.ManyToManyField(Russia)
  3. name = models.CharField(maxlength=255)
  4. description = models.TextField()
  5. directory_order = models.IntegerField(default=2)
  6. updated = models.DateTimeField(auto_now=True)
  7. def __unicode__(self):
  8. return self.name
  9. class Admin:
  10. pass

я немного изменил способ хранения, и путь храню примерно так 2/3/4 (то есть в начале и в конце нет /, в отличии примера с talks.php.net). В итоге по функциональности получается каталог точно такой же как у Яндекса, пока я застрял на постраничном выводе, он работает но не так как бы хотелось :)

Поле ManyToManyField позволяет хранить в разных разделах один и тот же элемент, примерно так же как если в яндекс каталоге зайти в Hi-tech там будут все элементы из всех подразделов.

ps: полезная настройка в settings.py которая устанавливает что все MySQL таблицы по умолчанию будут InnoDB

  1. DATABASE_OPTIONS = {"init_command": "SET storage_engine=INNODB",}

если это не указать, то таблицы будут MyISAM и ForeignKeys создаваться не будут.

Еще по теме:  

Установка Django под Windows

В продолжение предыдущего поста об установке Django на виртуальном хостинге сегодня хочу описать как установить django в операционной системе Windows.

Для начала необходимо скачать и установить:

Я ставил django из SVN (самую последнюю версию), для того чтобы ее скачать необходимо выполнить следующее:
после установки TortoiseSVN, заходим в папку куда хотим скачать дистрибутив, жмем правой кнопкой, в появившемся меню выбираем SVN Checkout.

установка django
В появившемся окне вводим URL: http://code.djangoproject.com/svn/django/trunk/ жмем ОК, дистрибутив начинает скачиваться
установка django

установка django

Если все успешно скачается, появится надпись
Updated X:\folder
Completed At revision 6710 (число будет другим)

Устанавливаем Django:

  • Пуск -> выполнить (или на клавиатуре одновременно значок Windows+R)
  • cmd
  • в окне командной строки:
  • cd \
  • cd \temp (я скачивал все в папку c:\temp)
  • python setup.py install

Теперь необходимо поменять переменные окружения, чтобы можно было вводить django-admin.py, а не полный путь к нему (типа C:\python25\somefolder\django-admin.py).
Для этого заходим в свойсва системы (жмем одновременно на клавиатуре значок Windows + Pause, или Правой кнопкой на "Мой компьютер" -> Свойства), там находим переменные окружения, потом находим в нижней части окна Path, жмем "Правка", и в конце дописываем C:\Python25;C:\Python25\Scripts.

установка django
После чего перезагружаемся.

Дальнейшая установка рассматривается в этом видео.

Еще по теме:  

Использование sqlite и Django

Создание каждой новой базы данных для нового веб-сайта на виртуальном хостинге довольно таки не дешевое занятие. Раньше при использовании Django я каждый раз заводил новую PosgreSQL базу, недавно зашел посмотрел во сколько мне это обходится, оказалось 841 рубль
В связи с тем что мои сайты потребляют очень мало трафика использовать полноценные базы данных смысла просто нет. Судя по информации на wiki sqlite использование этой базы данных оправдано для сайтов с посещаемостью до 10000 хитов в сутки.

Еще по теме:  

Как установить 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 и модулей, и каталог куда мы все это будем устанавливать

  1. $ cd
  2. $ mkdir build python

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

  1. $ cd build
  2. $ 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
  3. $ tar zxf Django-0.96.tar.gz
  4. $ tar zxf psycopg2-2.0.6.tar.gz
  5. $ tar zxf flup-0.5.tar.gz
  6. $ cd Django-0.96
  7. $ python setup.py install --prefix /home/username/python
  8. $ cd ../psycopg2-2.0.6
  9. $ 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 такой метод установки не сработал, поэтому он устанавливается таким образом:

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

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

  1. 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:

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

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

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

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

  1. File "", line 1
  2. import psycopg2
  3. ^
  4. SyntaxError: invalid syntax

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

  1. #!/usr/local/bin/python
  2.  
  3. import sys
  4. sys.path.append('/home/username/python/lib/python2.4/site-packages')
  5. sys.path.append('/home/username/django_projects')
  6.  
  7.  
  8. from fcgi import WSGIServer
  9. from django.core.handlers.wsgi import WSGIHandler
  10.  
  11. import os
  12. os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
  13. WSGIServer(WSGIHandler()).run()

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

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

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

  1. Options +ExecCGI
  2. AddHandler fastcgi-script .fcgi
  3.  
  4. RewriteEngine On
  5. RewriteBase /
  6. RewriteRule ^(dispatch\.fcgi/.*)$ - [L]
  7. 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

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

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

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

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

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

  1. $ cd ~/django_projects/myproject/
  2. $ python manage.py syncdb
  3. Creating table auth_message
  4. Creating table auth_group
  5. Creating table auth_user
  6. Creating table auth_permission
  7. Creating table django_content_type
  8. Creating table django_session
  9. Creating table django_site
  10. Creating table django_admin_log
  11.  
  12. You just installed Django's auth system, which means you don't have any superusers defined.
  13. Would you like to create one now? (yes/no): yes
  14. Username (Leave blank to use 'boris'): someuser
  15. E-mail address: contact@somesite.ru
  16. Password:
  17. Password (again):
  18. Superuser created successfully.
  19. Installing index for auth.Permission model
  20. Installing index for auth.Message model

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

Еще по теме:  

Ошибка 500 при работе с Django через FastCGI (решение)

В логах ошибка выглядит так:

  1. [Fri Sep 28 00:43:49 2007] [error] [client 85.141.235.249] FastCGI: comm with (dynamic) server "/storage/home/username/domain.ru/dispatch.fcgi" aborted: (first read) idle timeout (30 sec)
  2. [Fri Sep 28 00:43:49 2007] [error] [client 85.141.235.249] FastCGI: incomplete headers (0 bytes) received from server "/storage/home/username/domain.ru/dispatch.fcgi"

Одна из причин возникновения подобных ошибок - неправильный путь к Python. Для того чтобы определить путь к Python можно воспользоваться командой whereis:

  1. $ whereis python
  2. python: /usr/local/bin/python /usr/local/man/man1/python.1.gz /usr/ports/lang/python
После чего необходимо проверить содержимое файла ~/domain.ru/dispath.fcgi в самой первой строчке должно быть написано #!/usr/local/bin/python

Несколько особенностей при использовании Django на виртуальном хостинге с FastCGI: например мы разрабатываем свой первый сайт при помощи официального руководства, создаем модель голосования (Polls), все сохраняем, заходим на сайт и видим разноцветную фиолетово-синюю страницу с ошибкой:

  1. TemplateDoesNotExist
  2.  
  3. A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
Как я понял причиной этого является то что при запуске создается несколько процессов, в одном из них болтается старая версия кода, в другом треде - новая. Видимо этим и объясняется что время от времени ошибка то появляется то пропадает.

На Dreamhost wiki на этот случай написан совет убить python командой pkill python, но у меня она не сработала, видимо по причине того что fcgi, python работают от пользователя www-server или какого то еще.

Решение этой проблемы:

  • в каталоге cgi-bin создаем скрипт с таким содержанием
    1. #!/bin/sh
    2. killall python
    ставим правильные права ($chmod 750 kill_python2ADF23x.sh)запускаем его http://www.domain.ru/cgi-bin/kill_python2ADF23x.sh Имя файла скрипта специально содержит случайные символы чтобы его не запустил кто-то, не знающий этого имени.
  • после этого необходимо убить все byte-compled файлы, которые создает python:
    1. cd ~/django_projects/
    2. $ find ./ -name \*.pyc -type f -exec rm {} \;
    3. $ find ./ -name \*.pyo -type f -exec rm {} \;
    4. $ touch ~/domain.ru/dispatch.fcgi ~/build/flup-0.5/flup/server/fcgi.py

    На всякий случай полезно очистить кэш браузера и обновить страницу, если глюки продолжаться то необходимо выпоснить приведенные выше команды find ... в корневой директории где установлен сам django.
Еще по теме:  

Последние комментарии