2010-01-28 19 views
0

我有這行我wsgi.conf文件:如何從我的django設置文件訪問WSGIScriptAlias?

WSGIScriptAlias /trunk "c:/app/trunk/app.wsgi" 

在我的Django的設置文件,我需要知道別名「/主幹」獲得LOGIN_URL正常工作。我如何從我的apache設置中檢索這個值?

謝謝! Pete

+0

你可以添加更多的細節,你爲什麼試圖做到這一點? settings.py包含項目設置,那麼爲什麼不只是'LOGIN_URL =/trunk ...',而不是試圖使它基於wsgi config動態化呢?無論如何,每個項目都會有不同的wsgi配置和settings.py ... – cethegeek 2010-01-28 14:42:36

+0

我運行這個應用程序在不同的別名下的多個服務器上。我希望自動獲取別名,而不是爲每個服務器設置一個設置文件。 – slypete 2010-01-28 15:23:12

回答

0

既然你想從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的配置的信息。

+0

沒有辦法從apache環境中獲取它?我可以將它聲明爲apache配置中的變量嗎? – slypete 2010-01-28 21:45:15

+0

@slypete:據我所知,Apache配置與python或Django環境無關。這個wsgi.conf文件包含在httpd.conf中並由Apache服務器讀取。到那時爲止,python不會起作用。當對wsgi.conf中定義的url發出請求時,python會發揮作用來爲您的django站點提供服務。我沒有看到你將如何在Apache配置中聲明一個python變量。至少,這是我的理解。 – cethegeek 2010-01-28 21:50:52

+0

我的想法是設置一個apache環境變量,然後使用os.environ從python中選擇它。但是,它似乎沒有工作。 – slypete 2010-01-28 21:56:47

2

訪問原始WSGI environ字典以查找特定請求並查找'SCRIPT_NAME'變量。這個值是使用WSGIScriptAlias時指定的WSGI應用程序的名義掛載點。通過每個請求環境獲取它是自動執行此操作的唯一真正方法。你無法從請求之外得到它,應該沒有真正需要你這樣做。

按照權利,Django應該提供一種自動將應用程序的掛載點插入到配置的URL中的方式。你也許應該在官方的Django用戶列表中提出這個問題,如果你找不到這樣做的方式,或許需要改變Django。

相關問題