1

我的目标是想出一个可移植的 urllib2 解决方案,它会发布一个表单,然后将用户重定向到出现的内容。POSTing 部分很简单:

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

提供data将请求类型设置为 POST。现在,我怀疑我应该关心的所有数据都来自response.info()& response.geturl()。我应该做一个self.redirect(response.geturl())里面的get(self)方法webapp.RequestHandler

但是我应该如何处理标题?还有什么我忽略的吗?代码片段受到高度赞赏。:)

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()
4

3 回答 3

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

于 2009-10-02T01:57:40.467 回答
2

我怀疑这几乎总是会失败。当您发布表单时,您最终到达的 URL 就是您发布到的 URL。将其他人发送到此 URL,或者甚至使用刚刚发布的同一浏览器再次访问它,都将执行 GET,并且该页面不会包含已发布的表单数据。唯一可行的方法是,如果站点在 POST 之后重定向到包含某种会话信息的 URL。

于 2009-10-02T01:51:37.600 回答
0

你会发现使用 mechanize 比直接使用 urllib2 容易得多

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

于 2009-10-02T04:22:42.913 回答