2011-08-24 46 views
0

我有一個django應用程序,主要使用管理界面和一些我自己的視圖來設置。我的本地機器上的開發服務器上一切正常。Django重定向錯過了WSGIScriptAlias url的一部分

但是在生產服務器上,使用Apache和mod_wsgi,當我在其中一個視圖中發出重定向語句時,它正在搞亂這些URL。而不是去

 www.hostname.com/wsgi/django/admin/myapp/myform.html 

它去

 www.hostname.com/admin/myapp/myform.html 

的Apache不認識一個管理員文件夾下的東西,所以我得到一個錯誤。

所以在我的Apache配置我有以下,所以,根據WSGI/Django的東西被髮送到我的應用程序:

WSGIScriptAlias /wsgi/django /project/production/public/wsgi/django_eclipse/myapp.wsgi 

在我的問題的看法,我有以下:

return redirect('/admin/sequencing/load_flowcell?' + params)  

我可以做這個工作,如果我改變重定向來包含'/ wsgi/django'部分,但這意味着我不能讓我的開發服務器上的一個保持一致。在Django設置中有沒有辦法,或者http.conf來設置,這樣我的重定向就會自動包含這部分URL?

+0

發佈您的WSGI腳本文件,以便我們確保您沒有在其中完成某些操作以清除SCRIPT_NAME如何傳入應用程序。博客上有各種各樣的錯誤腳本,這些腳本在掛載到一個子URL時使用是錯誤的。 –

+0

是否有機會將答案標記爲已接受? – Thomas

回答

-1

編輯:REAL FIX

from django.core.urlresolvers import reverse, get_script_prefix 
.... 
#only of you absolutely HAVE to have a hardcoded url 
return redirect(get_script_prefix()+'admin/sequencing/load_flowcell?'+params) 
#better! 
return redirect(reverse('admin:index')+sequencing/load_flowcell?'+params) 

警告: https://docs.djangoproject.com/en/dev/howto/deployment/modpython/#basic-configuration

<Location "/mysite/"> 
    SetHandler python-program 
    PythonHandler django.core.handlers.modpython 
    SetEnv DJANGO_SETTINGS_MODULE mysite.settings 
    PythonOption django.root /mysite  <---- Make sure you have this 
    PythonDebug On 
</Location> 
+0

這與OP無關,因爲OP明確(正確)使用mod_wsgi而不是mod_python。 –

+0

關鍵是這個設置可以讓應用程序追加這個前綴。這就是我如何閱讀這個問題,作爲對「無前綴」問題的回答。在重定向中沒有注意到沒有前綴。 – Thomas

+0

謝謝,Django是一個相當全面的框架,所以並不總是很容易找到你應該在文檔中使用的部分。 –

0

的Django可以使用sites framework倒車時產生正確的URL - 如果相關的Site行改變domain場(如您的settings.py中的SITE_ID所示)至http://www.hostname.com/wsgi/admin,則一切都應正常工作。

(也可能有,你有普通的URL的幾個地方,例如LOGIN_URLLOGIN_REDIRECT_URL設置,您應該確保包括/wsgi/admin一部分。)

+0

非常感謝,將SITE_ID添加到設置文件中,然後在我的重定向語句中使用反轉('admin:index')+。我現在可以清理一些更多的解決方法。 –

+0

好吧,它並不是settings.py中的SITE ID變量,因爲它最終打破了很多東西,因爲它應該是一個整數。使用reverse('admin:index')似乎修復了它。 –

0

那麼,它重定向到正是你告訴網址它來。

這就是爲什麼你不應該在Django的任何地方對URL進行硬編碼的原因。如果您使用了URL反轉功能,那麼會自動添加WSGI前綴 - 它已經知道它,並在使用{% url %}標記或reverse()函數時將其考慮在內。

在您的urls.py中爲URL指定一個名稱,並在調用中使用該名稱來重定向而不是URL,並且所有應用都可以正常工作。無需更多設置。

+0

如果你要投票的東西,請說出原因。 Daniel說的是正確的,當你在Web服務器的一個子URL上安裝時,你必須在Django中使用正確的方法來反轉URL。這個規則有一些例外,但丹尼爾是正確的概念,不應該暗示說他爲什麼說不適用。 –

+0

我曾嘗試與相關網址,但它給出的錯誤暗示重定向期望一個硬編碼的URL。 –