2012-01-03 75 views
1

我試圖獲取在Python中未使用Web框架請求的網址。例如,在一個頁面上(比如說/main/index.html),用戶點擊一個URL去/ main/foo/bar(/ foo/bar不存在)。然後,Apache(使用mod_wsgi)將用戶重定向到/ main /的PHP腳本,然後獲取URL並搜索MySQL以查找任何匹配的字段。然後剩下的字段被返回。這有助於在PHP中:在沒有框架的情況下獲取當前請求的Python網址

$_SERVER["REQUEST_URI"]; 

因爲它變得越來越困難,而數據庫在不斷變化的結構來維護的PHP代碼我寧可不使用PHP。

我很確定有一個更好的方法,任何提及將不勝感激。爲了相關性,這甚至有可能(在Python中獲取請求的URL)?我應該只使用一個框架,雖然看起來很簡單嗎?

由於提前,

傑米

注:我不想使用GET出於安全目的。

+1

你如何整合Python和Apache? CGI? mod_python的?反向代理和BaseHTTPServer?還有別的嗎? – 2012-01-03 07:39:16

+0

抱歉。我正在使用mod_python。如果我使用mod_wsgi會更容易嗎? – Jamie 2012-01-03 07:40:29

+2

如果你使用mod_wsgi,那麼死亡率會更低。 – 2012-01-03 07:44:29

回答

1

與PHP,Python的是一種通用語言,並沒有這種內置的。

你可以收集這些信息的方式取決於部署的解決方案:

  • CGI(主要是跟Apache mod_python的,不建議使用):看到@Antti哈帕拉解決方案
  • WSGI(其它大多數部署解決方案):見@gurney alex解決方案

但是你會遇到更多的問題:會話hanling,網址管理,cookies,甚至是簡單的POST/GET解析。如果你不使用框架,所有這些都需要手動完成。如果你覺得像一個框架是過度殺傷(但真的,令人難以置信的工具像Django是值得的),你可以使用像微觀框架bottle

微型框架通常會爲您提供這種繁重的工作,但沒有複雜的設置或額外的高級功能。瓶子實際上是零設置一個是一個文件庫。

你好字與瓶:

from bottle import route, run, request 

@route('/hello/:name') 
def index(name='World'): 
    return '<b>Hello %s! You are at %s</b>' % (name, request.path) 

run(host='localhost', port=8080) 

request.path包含你想要什麼,如果你訪問http://127.0.0.1:8080/hello/you,您將獲得:

Hello you! You are at /hello/you 
+0

感謝您的幫助。我刪除了mod_python並切換到mod_wsgi。由於某種原因,最後一個命令 run(host ='localhost',port = 8080) 正在無限循環中運行,然後中斷(帶或不帶apache)。這顯然不正常。我的服務器在某處是否配置有誤? – Jamie 2012-01-03 13:57:08

+0

run(host ='localhost',port = 8080)只是一個測試服務器,不適用於生產。這是一個無限循環,因爲它是一個服務器。如果你想使用apache,你需要使用mod_wsgi來運行它,但是你通常會在你的開發週期結束時這樣做,當你部署它來測試它時。你是用什麼做的。 「它打破了什麼意思」 – 2012-01-03 16:00:06

+0

啊對,對不起,我現在明白了。謝謝你的幫助。 – Jamie 2012-01-07 12:09:13

6

那麼,如果您將程序作爲CGI腳本運行,則可以在os.environ中獲得相同的信息。但是,如果我沒有記錯,REQUEST_URI本身不是CGI標準的一部分,您需要使用os.environ['SCRIPT_NAME'],os.environ['PATH_INFO']os.environ['QUERY_STRING']來獲取等效數據。

不過,我非常希望你能看到一些輕量級的框架,比如金字塔。 Python的平原CGI速度很慢,通常只是屁股疼痛。

+0

我注意到了。謝謝你的幫助。 – Jamie 2012-01-03 07:58:39

+1

REQUEST_URI也是瀏覽器客戶端提供的原始URL,未被規範化。它可能包含'../'序列,重複斜線和%編碼,所有這些都可能被服務器以某種方式修改。因此,在嘗試操縱REQUEST_URI的值時,您必須非常小心,因爲您的解釋可能最終與Web服務器將其解釋爲不同。當試圖在斜線上分割時,原始中存在'../'序列尤其是個問題。 – 2012-01-03 21:56:01

0

當使用mod_python的,如果我沒有記錯,你可以使用類似:

from mod_python import util 
def handler(request):  
    parameters = util.FieldStorage(request) 
    url = parameters.get("url", "/") 

http://www.modpython.org/live/current/doc-html/pyapi-util.htmlmod_python.util模塊的更多信息和FieldStorage類(包括示例)

1

當我想要得到任何框架之外的URL使用Apache2和Mod_WSGI我使用

environ.get('PATH_INFO')

在我的應用程序()函數內部。

相關問題