Я хочу запустить простой тестовый проект в псевдониме подкаталога на нашем сервере разработки. Базовая установка - nginx с местом, которое передает все в подкаталог приложения wsgi.
Django, очевидно, не понимает, что он работает в псевдониме подкаталога, который полностью разрушает создание и разбор URL.
Я не мог найти какой-либо префикс-подобный параметр в документах, и мой google fu тоже не помог так... поэтому я спрашиваю здесь.
Единственное, что я нашел, это параметр FORCE_SCRIPT_NAME, который, по крайней мере, исправляет создание URL-адресов. (см.: http://docs.webfaction.com/software/django/config.html#mounting-a-django-application-on-a-subpath)
К сожалению, это не устраняет синтаксический анализ urlconf, хотя упомянутый сайт предполагает, что.
Можно ли запустить приложение django в псевдониме подкаталога, и если да, то как?
nginx config:
server {
location /fancyprojectname/static {
alias /srv/fancyprojectname/static;
}
location /fancyprojectname/ {
uwsgi_pass unix://var/run/uwsgi/app/fancyprojectname/socket;
include uwsgi_params;
}
}
Edit
Итак, установка "uwsgi_param SCRIPT_NAME/fancyprojectname;" в местоположении nginx делает FORCE_SCRIPT_NAME ненужным - к сожалению, сопоставление URL по-прежнему не работает.
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
Что я думаю, что происходит: поскольку регулярное выражение администратора начинается с "^ admin", а фактический URL - "fancyprojectname/admin/", Django не может правильно соответствовать URL-адресам, даже если установлен SCRIPT_NAME.
Решение
Итак, это действительно проблема с SCRIPT_NAME.
В спецификации WSGI говорится следующее:
SCRIPT_NAME Начальная часть URL-адреса запроса "путь", которая соответствует объекту приложения, так что приложение знает свою виртуальную "место нахождения". Это может быть пустая строка, если приложение соответствует "корню" сервера.
PATH_INFO Остальная часть URL-адреса запроса "путь", обозначающая виртуальное "местоположение" целевой заявки в приложении. Это может быть пустая строка, если URL-адрес запроса нацелен на корень приложения и не имеет завершающей косой черты.
Nginx не устанавливает SCRIPT_NAME автоматически, поэтому это необходимо установить в любом случае. Впоследствии PATH_INFO ошибочен, потому что в настройке по умолчанию Nginx устанавливает это значение в $document_uri, что будет полным URL.
"uwsgi_modifier1 30;" сообщает Nginx, чтобы установить UWSGI_MODIFIER_MANAGE_PATH_INFO, что, в свою очередь, сообщает UWSGI об отключении SCRIPT_NAME из PATH_INFO.
Сочетание этих настроек, похоже, работает, поскольку Django теперь может правильно генерировать AND и сопоставлять URL-адреса.