-
Решил запустить приложение под Apache 2.2 и mod_wsgi. Всё запустилось, но мне не совсем понятны возможные варианты размещения директорий и путей.
apache-vhosts.conf:<VirtualHost *:80> ServerAdmin webmaster@example.com ServerName www.example.com ErrorLog "/home/trafstat/www/logs/error.log" CustomLog "/home/trafstat/www/logs/access.log" common Alias "/media/" "/usr/local/lib/python2.5/site-packages/django/contrib/admin/media/" <Directory "/usr/local/lib/python2.5/site-packages/django/contrib/admin/media"> Order allow,deny Allow from all </Directory> Alias "/static/" "/home/trafstat/www/scripts/trafstat/static/" <Directory "/home/trafstat/www/scripts/trafstat/static"> Order allow,deny Allow from all </Directory> WSGIScriptAlias "/" "/home/trafstat/www/htdocs/wsgi/trafstat.wsgi" <Directory "/home/trafstat/www/htdocs/wsgi"> Order allow,deny Allow from all </Directory> # DocumentRoot "/home/trafstat/www/htdocs" # <Directory "/home/trafstat/www/htdocs"> # Order allow,deny # Allow from all # </Directory> </VirtualHost>
trafstat.wsgi:import os, sys projpath = "/home/trafstat/www/scripts" if projpath not in sys.path: sys.path.append(projpath) os.environ['DJANGO_SETTINGS_MODULE'] = 'trafstat.settings' from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler()
Файлы проекта у меня лежат /home/trafstat/www/scripts/trafstat и пути импорта включают имя проекта. Однако под встроенным джанговским сервером в операторах импорта работает даже импорт без указания имени проекта (например в INSTALLED_APPS я могу писать как trafstat.appname, так и просто appname).
Вопросы:
1. В каких случаях один wsgi-обработчик может обслуживать несколько проектов чтобы потребовалось явное указание их имён в операторах импорта? Иначе говоря, для чего в sys.path нужно указывать родительскую директорию проекта а не сам проект? Правильно ли я понял, что development-сервер добавляет в PYTHONPATH не только родительскую директорию но и сам проект?
2. Как принято раздавать статический контент админки? -
В каких случаях один wsgi-обработчик может обслуживать несколько проектов чтобы потребовалось явное указание их имён в операторах импорта?
Имя проекта не требуется. Более того, использование имени проекта при импорте модулей по сути является ошибкой. Не надо использовать его, т.к. это повышает связность, и преимуществ не дает.
Иначе говоря, для чего в sys.path нужно указывать родительскую директорию проекта а не сам проект?
Потому что вы на это имя завязались, но вовсе не обязательно. И вообще все пляски с
sys.pathможно доверить самой джанге, используяsetup_environ.Правильно ли я понял, что development-сервер добавляет в PYTHONPATH не только родительскую директорию но и сам проект?
Там используется как раз
setup_environ, который на время добавляет родительскую директорию, импортирует проект, потом удаляет директорию изsys.path. Саму директорию проекта добавлять смысла нет, т.к. она добавляется интерпретатором как текущая для скрипта (manage.py)Как принято раздавать статический контент админки?
Так же как и любую другую статику.
-
Почему тогда в стандартном туториале http://docs.djangoproject.com/en/dev/intro/tutorial01/ при каждом импорте указывается имя проекта mysite?
Не для избежания ли возможных конфликтов импорта того же settings.py в случае когда в путь импорта по той или иной причине попадёт несколько таких проектов? -
Официальное объяснение — чтобы не вводить в тьюториале еще одну концепцию, а сделать "попроще". Но Все Знают™, что это плохо.
-
Кажется я понял - так приложения получаются отвязанными от проекта и могут распространяться отдельно и встраиваться куда угодно.
-
Не для избежания ли возможных конфликтов импорта того же settings.py в случае когда в путь импорта по той или иной причине попадёт несколько таких проектов?
Директория проекта, всегда первая в
sys.path, следовательно при поиске модуля в неё интерпретатор заглянет первой.Кажется я понял - так приложения получаются отвязанными от проекта и могут распространяться отдельно и встраиваться куда угодно.
Бинго!:-)
-
Отщеплен новый топик "Перезагрузка wsgi-демона по количеству памяти".
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.


