2010-04-28 84 views
2

最近我偶然發現了一個問題,即使我已經解決了這個問題,我想聽聽您對正確/簡單/採用解決方案的看法。Webfaction apache + mod_wsgi + django配置問題

我正在開發使用Django + python的網站。當我使用「python manage.py runserver」在本地機器上運行它時,默認情況下本地地址爲http://127.0.0.1:8000/

然而,生產服務器上我的應用程序有其他的網址,與路徑 - 像「http://server.name/myproj/

我需要生成和使用固定的網址。如果我使用{%URL視圖PARAMS%},我理解的是相對於/路徑,因爲我的urls.py包含此

urlpatterns = patterns('', 
(r'^(\d+)?$', 'myproj.myapp.views.index'), 
(r'^img/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/img' }), 
(r'^css/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/css' }), 
) 

到目前爲止,我看到2個解決方案:

  1. 修改urls.py,包括「/的Myproj /」在生產運行的情況下
  2. 使用request.build_absolute_uri()用於在views.py鏈路或通過一些變量與「主機名:端口/路徑」在模板

有更漂亮的方式以解決這個問題?謝謝。

更新:好的,這個問題似乎不是在Django中,而是以webfaction的方式來配置wsgi。應用程序與URL「hostname.com/myapp」 Apache配置包含以下行

WSGIScriptAlias//home/dreamiurg/webapps/pinfont/myproject.wsgi 

所以,SCRIPT_NAME是空的,而我看到的唯一的解決辦法是去mod_python的或從根爲我的應用程序。有任何想法嗎?

回答

3

你不需要做任何特別的事情。 Django支持您在服務Django站點(而不是根站點)時由mod_wsgi設置的SCRIPT_NAME環境變量,並自動將其前置到url反向代碼。

如果你使用mod_python(你不應該),你可能需要在你的Apache配置中設置django.root

更新我懷疑這是由於Webfaction通過Apache的代理實例提供Django的網站的方式 - 這種情況下具有通過Webfaction的控制面板沒有確定實際的知識掛載點。

在這種情況下,您可能需要在.wsgi腳本中手動設置SCRIPT_NAME。我想,這應該工作:

_application = django.core.handlers.wsgi.WSGIHandler() 

def application(environ, start_response): 
    os.environ['SCRIPT_NAME'] = '/myproj/' 
    return _application(environ, start_response) 
+0

那麼,它不是 - 至少不與webfaction託管。我使用mod_wsgi的和給定的一個以上urlpatterns的,下面的代碼 「從django.core.urlresolvers導入反向 永久=反向(‘myproj.myapp.views.index’)」 將返回「/」。 除此之外,{%url pinfont.label.views.index%}將給出相同的路徑「/」。 – 2010-04-28 13:13:17

+1

謝謝你,我自己找到了問題的原因,但你真的幫助.wsgi解決方案。小修補程序 - 請在第4行將'os.environ'更改爲'environ'。 – 2010-04-28 15:54:10

2

變化:

WSGIScriptAlias//home/dreamiurg/webapps/pinfont/myproject.wsgi 

到:

WSGIScriptAlias /myproj /home/dreamiurg/webapps/pinfont/myproject.wsgi 

然後WebFaction的nginx的前端配置更改爲代理到後端 '/的Myproj'代替 '/'。

這應該是所有需要的。你不應該在urls.py中使用'/ myproj'前綴。

換句話說,只是確保的安裝點後端是相同地方出現安裝在前端。

將WSGI腳本文件修改爲fudge SCRIPT_NAME,儘管它可能有效,但通常不建議這樣做,因爲不允許Apache/mod_wsgi執行正確的操作,這可能會產生其他影響。

+0

謝謝,我也會試試這個 – 2010-04-29 08:15:57