2009-10-02 124 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