urllib2:提交表单后重定向
我的目标是找到一个可以在不同环境下使用的 urllib2 解决方案,能够提交一个表单,然后把用户重定向到返回的结果页面。提交表单的部分其实很简单:
request = urllib2.Request('https://some.site/page', data=urllib.urlencode({'key':'value'}))
response = urllib2.urlopen(request)
在这里提供 data
就是把请求类型设置为 POST。现在,我怀疑我需要关注的所有数据都来自于 response.info()
和 response.geturl()
。我应该在 webapp.RequestHandler
的 get(self)
方法里执行 self.redirect(response.geturl())
。
但是我该怎么处理请求头呢?还有其他我忽略的地方吗?如果能提供一些代码片段就太好了。:)
谢谢大家。
补充:这是我想到的一个简单解决方案。虽然可以重定向,但远程服务器显示错误,提示之前提交的表单没有匹配项:
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()
3 个回答
0
你会发现使用 mechanize 比直接使用 urllib2 要简单得多。
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。
2
我觉得这几乎总是会失败。当你提交一个表单时,最后到达的那个网址就是你提交表单的那个网址。如果你把别人引导到这个网址,或者用刚刚提交过表单的同一个浏览器再次访问这个网址,浏览器会进行一个GET请求,而这个页面上不会有你之前提交的表单数据。只有在提交表单后,网站把你重定向到一个包含某种会话信息的网址时,这种情况才有可能成功。