2009-08-11 5 views
2

J'utilise urllib2 pour publier des données dans un formulaire. Le problème est que le formulaire répond avec une redirection 302. Selon Python HTTPRedirectHandler le gestionnaire de redirection prendra la demande et la convertira de POST à ​​GET et suivra le 301 ou 302. Je voudrais préserver la méthode POST et les données passées à l'ouvreur. J'ai fait une tentative infructueuse à un HTTPRedirectHandler personnalisé en ajoutant simplement data = req.get_data() à la nouvelle demande.Comment faire python urllib2 suivre la méthode de redirection et de maintien

Je suis sûr que cela a déjà été fait, alors j'ai pensé que je ferais un post.

Remarque: ceci est similaire à this post et this one mais je ne veux pas empêcher la redirection que je veux juste conserver les données POST.

Voici mon HTTPRedirectHandler qui ne fonctionne pas

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

Le formulaire sur lequel vous travaillez est-il sur Internet? J'ai quelques idées sur la façon de diagnostiquer ce qui se passe, mais pas de réponse correcte pour l'instant; J'aimerais enquêter, cependant. –

Répondre

6

Ceci est en fait une très mauvaise chose à faire plus je pensais à ce sujet. Par exemple, si je soumets un formulaire à http://example.com/add (avec les données de poste pour ajouter un article) et la réponse est une redirection 302 à http://example.com/add et je poste les mêmes données que j'ai posté la première fois que je vais finir dans une boucle infinie . Je ne sais pas pourquoi je n'y avais pas pensé avant. Je vais laisser la question ici à titre d'avertissement à quiconque pense à faire cela.

Questions connexes