我想在我们的开发服务器上的子目录别名中运行一个简单的测试项目。基本设置是一个 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配置:
server {
location /fancyprojectname/static {
alias /srv/fancyprojectname/static;
}
location /fancyprojectname/ {
uwsgi_pass unix://var/run/uwsgi/app/fancyprojectname/socket;
include uwsgi_params;
}
}
编辑
因此,设置“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/”,因此即使设置了 SCRIPT_NAME,Django 也无法正确匹配 URL。
解决方案
所以,这确实是 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 去除 PATH_INFO 的 SCRIPT_NAME。
这些设置的组合似乎有效,因为 Django 现在可以正确生成和匹配 URL。