我想在開發服務器上的子目錄別名中運行簡單的測試項目。基本設置是一個nginx,具有將子目錄中的所有內容傳遞給wsgi應用程序的位置。通過子路徑中的nginx + uwsgi運行django應用程序
Django顯然不知道它運行在一個子目錄別名中,它完全破壞了URL的生成和解析。
我無法在文檔中找到任何類似前綴的設置,而我的谷歌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)),
)
我認爲正在發生的事情:當管理員用正則表達式「^管理員」和實際的URL是「fancyprojectname /管理/」,Django的不正確匹配的URL開始,即使是SCRIPT_NAME組。
解決方案
所以,它的確是與SCRIPT_NAME的問題。
的WSGI specification說以下內容:
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現在可以正確生成AND匹配URL。
請看看https://stackoverflow.com/a/40496307/1588163你會發現有更新的方式來完成這項 – clapas
[見:如何用uwsgi安裝Django應用程序](https://stackoverflow.com/questions/19475651/how-to-mount-django-app-with-uwsgi) –