2009-10-02 196 views
1

我的目標是想出一個可移植的urllib2解決方案,它將POST一個表單,然後將用戶重定向到出來的東西。 張貼部分很簡單:urllib2:提交表單然後重定向

request = urllib2.Request('https://some.site/page', data=urllib.urlencode({'key':'value'})) 
response = urllib2.urlopen(request) 

提供data集請求類型爲POST。現在,我懷疑我應該關心的所有數據來自response.info() & response.geturl()。我應該在webapp.RequestHandlerget(self)方法內做self.redirect(response.geturl())

但我該怎麼處理標題?還有什麼我忽略了?代碼片段受到高度讚賞。 :)

TIA。

編輯:這是我想出的一個天真的解決方案。重定向,但遠程服務器顯示一個錯誤,表示沒有匹配到先前提交的表單:

info = response.info() 
for key in info: 
    self.response.headers[key] = info[key] 
self.response.headers['Location'] = response.geturl() 
self.response.set_status(302) 
self.response.clear() 
+0

你想重定向到「交出」會議? (這不起作用)。或者你想向用戶顯示結果? (在這種情況下,你可以代理的HTML) – 2009-10-02 05:18:03

+0

是的,我試圖執行「交出」。 – yanchenko 2009-10-03 00:51:27

回答

2

我懷疑這會幾乎總是失敗。當您發佈表單時,您最終得到的網址就是您發佈的網址。發送其他人到這個URL,或者甚至用剛剛發佈的同一個瀏覽器再次訪問它,將會進行一次GET,並且該頁面將沒有被髮布的表單數據。這將工作的唯一方法是,如果網站在POST後重定向到包含某種會話信息的URL。

+0

因此,我將一些東西發佈到URL上,服務器在響應中設置了一個cookie並且不重定向。現在,我爲客戶端設置了相同的cookie,並將其重定向到該URL。我錯了什麼? – yanchenko 2009-10-03 00:54:03

+0

大多數(所有?)瀏覽器都不會讓您的網站爲其他網站設置Cookie,因此即使您請求的網站正在進行一些時髦的會話處理,而不是直接回復表單帖子,這也不起作用。我在想你所描述的根本不可能。 – geoffspear 2009-10-03 03:03:40

3

使用urllib2遵循重定向的標準方式是使用HTTPRedirectHandler。 (不知道你的「出來的東西」,但我假設一個標準的HTTP重定向這裏的意思,JavaScript重定向是一個不同的野獸)

# Created handler 
redirectionHandler = urllib2.HTTPRedirectHandler() 

# 2 apply the handler to an opener 
opener = urllib2.build_opener(redirectionHandler) 

# 3. Install the openers 
urllib2.install_opener(opener) 


request = urllib2.Request('https://some.site/page', data=urllib.urlencode({'key':'value'})) 
response = urllib2.urlopen(request) 

有關處理程序的詳細信息,請參閱urllib2.HTTPRedirectHandler

+0

因此,客戶端瀏覽器1)提交表單(POST)2)被重定向到某個頁面(GET)。我想在服務器端做1並將2留給客戶端瀏覽器(就像它自己完成的那樣)。 – yanchenko 2009-10-02 02:55:23