我有這行我wsgi.conf文件:如何從我的django設置文件訪問WSGIScriptAlias?
WSGIScriptAlias /trunk "c:/app/trunk/app.wsgi"
在我的Django的設置文件,我需要知道別名「/主幹」獲得LOGIN_URL正常工作。我如何從我的apache設置中檢索這個值?
謝謝! Pete
我有這行我wsgi.conf文件:如何從我的django設置文件訪問WSGIScriptAlias?
WSGIScriptAlias /trunk "c:/app/trunk/app.wsgi"
在我的Django的設置文件,我需要知道別名「/主幹」獲得LOGIN_URL正常工作。我如何從我的apache設置中檢索這個值?
謝謝! Pete
既然你想從Apache配置中獲取一個值,我猜你唯一能做的就是讀取文件並處理它。
喜歡的東西(假設你的settings.py生活在同一個目錄中wsgi.conf):
try:
f = open('wsgi.conf', 'r')
LOGIN_URL=[line for line in f.readlines() if 'WSGIScriptAlias' in line][0].split()[1]
finally:
f.close()
捕獲異常,如果該文件是不是有可能是一個好主意了。您的評論後
編輯:啊,我看你正在嘗試做的。 This thread可能有助於理解爲什麼使用os.environ
不起作用。他們目前不會幫助你,儘管替代:
簡而言之,apache的SETENV沒有在os.environ表示進程 環境設定值。相反,SetEnv在WSGI請求的上下文中設置了 值。
在你的代碼,你可以在request.environ引用方面:
def myView(request):
tier = request.environ['TIER']
這又是我。由於Apache的SetEnv正在做什麼,我不認爲你將有權訪問settings.py中的變量。看來解析文件仍然是唯一的選擇。
更多編輯:另一種選擇 - 你可以根據主機名決定嗎?
#settings.py
import socket
production_servers = { 'server1.com': '/trunk...',
'server2.com': '/trunk_2...' }
LOGIN_URL=production_servers[ socket.gethostname() ]
這完全迴避了包含在apache的配置的信息。
沒有辦法從apache環境中獲取它?我可以將它聲明爲apache配置中的變量嗎? – slypete 2010-01-28 21:45:15
@slypete:據我所知,Apache配置與python或Django環境無關。這個wsgi.conf文件包含在httpd.conf中並由Apache服務器讀取。到那時爲止,python不會起作用。當對wsgi.conf中定義的url發出請求時,python會發揮作用來爲您的django站點提供服務。我沒有看到你將如何在Apache配置中聲明一個python變量。至少,這是我的理解。 – cethegeek 2010-01-28 21:50:52
我的想法是設置一個apache環境變量,然後使用os.environ從python中選擇它。但是,它似乎沒有工作。 – slypete 2010-01-28 21:56:47
訪問原始WSGI environ字典以查找特定請求並查找'SCRIPT_NAME'變量。這個值是使用WSGIScriptAlias時指定的WSGI應用程序的名義掛載點。通過每個請求環境獲取它是自動執行此操作的唯一真正方法。你無法從請求之外得到它,應該沒有真正需要你這樣做。
按照權利,Django應該提供一種自動將應用程序的掛載點插入到配置的URL中的方式。你也許應該在官方的Django用戶列表中提出這個問題,如果你找不到這樣做的方式,或許需要改變Django。
你可以添加更多的細節,你爲什麼試圖做到這一點? settings.py包含項目設置,那麼爲什麼不只是'LOGIN_URL =/trunk ...',而不是試圖使它基於wsgi config動態化呢?無論如何,每個項目都會有不同的wsgi配置和settings.py ... – cethegeek 2010-01-28 14:42:36
我運行這個應用程序在不同的別名下的多個服務器上。我希望自動獲取別名,而不是爲每個服務器設置一個設置文件。 – slypete 2010-01-28 15:23:12