2009-08-11 44 views
2

我正在使用urllib2将数据发布到表单。问题是表单回复302重定向。根据Python HTTPRedirectHandler重定向处理程序将采取请求并将其从POST转换为GET并遵循301或302.我想保留POST方法和传递给opener的数据。通过简单地将data = req.get_data()添加到新的请求中,我在自定义HTTPRedirectHandler上做了一次不成功的尝试。如何使python urllib2遵循重定向并保留post方法

我确信这已经完成了,所以我想我会发一个帖子。

注意:这与this postthis one类似,但我不想阻止重定向我只想保留POST数据。

这里是我的化HTTPRedirectHandler不起作用

class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler): 
def redirect_request(self, req, fp, code, msg, headers, newurl): 
    """Return a Request or None in response to a redirect. 

    This is called by the http_error_30x methods when a 
    redirection response is received. If a redirection should 
    take place, return a new Request to allow http_error_30x to 
    perform the redirect. Otherwise, raise HTTPError if no-one 
    else should try to handle this url. Return None if you can't 
    but another Handler might. 
    """ 
    m = req.get_method() 
    if (code in (301, 302, 303, 307) and m in ("GET", "HEAD") 
     or code in (301, 302, 303) and m == "POST"): 
     # Strictly (according to RFC 2616), 301 or 302 in response 
     # to a POST MUST NOT cause a redirection without confirmation 
     # from the user (of urllib2, in this case). In practice, 
     # essentially all clients do redirect in this case, so we 
     # do the same. 
     # be conciliant with URIs containing a space 
     newurl = newurl.replace(' ', '%20') 
     return Request(newurl, 
         headers=req.headers, 
         data=req.get_data(), 
         origin_req_host=req.get_origin_req_host(), 
         unverifiable=True) 
    else: 
     raise HTTPError(req.get_full_url(), code, msg, headers, fp) 
+0

您是在公共互联网上使用的表单吗?我对如何诊断正在发生的事情有一些想法,但还没有正确的答案。不过,我想调查一下。 – 2009-08-11 04:38:50

回答

6

这其实是一个非常糟糕的事情,我越想过这个问题。例如,如果我向 http://example.com/add(包含发布数据添加项目)提交表单 ,并且回复是302重定向到http://example.com/add,并且我发布了第一次发布的相同数据,我将以无限循环结束。不知道为什么我以前没有想到这一点。我将这里的问题留给任何其他人考虑这样做的警告。