Wie machen Python urllib2 folgen umleiten und post-Methode halten
-
12-09-2019 - |
Frage
Ich bin mit urllib2 Daten in eine Form zu veröffentlichen. Das Problem ist, dass die Form mit einer 302-Umleitung antwortet. Nach Python HTTPRedirectHandler die Umleitungs-Handler die Anforderung nehmen und konvertieren sie von POST GET und folgen den 301 oder 302 I die POST-Methode und die Daten möchte die opener weitergegeben bewahren. Ich machte einen erfolglosen Versuch, in einem benutzerdefinierten HTTPRedirectHandler durch einfaches data = req.get_data Hinzufügen () auf den neuen Antrag.
Ich bin sicher, dass dies vorher getan worden ist, so dachte ich, ich würde einen Beitrag machen.
Hinweis: Dies ist ähnlich href="https://stackoverflow.com/questions/554446/how-do-i-prevent-pythons-urllib2-from-following-a-redirect"> diesen Beitrag und dieses aber ich will nicht die Umleitung verhindern ich möchte nur die POST-Daten halten.
Hier ist mein HTTPRedirectHandler, das nicht funktioniert
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)
Lösung
Dies ist eigentlich eine wirklich schlechte Sache, je mehr ich darüber nachgedacht, es zu tun. Zum Beispiel einreichen, wenn ich ein Formular http://example.com/add (mit Post-Daten ein Element hinzufügen) und die Antwort ist eine 302-Umleitung an http://example.com/add und I post die gleichen Daten, die ich das erste Mal habe ich geschrieben in einer Endlosschleife enden. Nicht sicher, warum ich noch nicht daran denken war. Ich werde die Frage hier nur als Warnung an alle verlassen sonst darüber nachzudenken, dies zu tun.