urllib2:提交表单后重定向

1 投票
3 回答
5494 浏览
提问于 2025-04-15 14:44

我的目标是找到一个可以在不同环境下使用的 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())

但是我该怎么处理请求头呢?还有其他我忽略的地方吗?如果能提供一些代码片段就太好了。:)

谢谢大家。

补充:这是我想到的一个简单解决方案。虽然可以重定向,但远程服务器显示错误,提示之前提交的表单没有匹配项:

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 要简单得多。

http://wwwsearch.sourceforge.net/mechanize/

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请求,而这个页面上不会有你之前提交的表单数据。只有在提交表单后,网站把你重定向到一个包含某种会话信息的网址时,这种情况才有可能成功。

撰写回答