2017-11-24 5 views
0

Wie ich einen Handler für einen Webservice in Draufgängertum schrieb (durch eine request.session()) stieß ich auf diese Besonderheit:Anfragen/Draufgängertum 302 Antwort auf POST in GET dreht (Python)

A POST-Anfrage Umdrehungen in eine GET-Anfrage, während sie umgeleitet wird. Verursacht, dass mein POST entstellt wird und ich kann das Ding nicht zum Funktionieren bringen.

EDIT: Die tatsächlichen Anfragen rufen von Draufgängertum wird wie erläutert in: How do you set a custom http client in Bravado? Was ich für die Einstellung der zusätzlichen Client-Seite Zertifikate benötigt.

So wird der Anforderungen Anruf/Sitzung selbst durch Bravado verdeckt.

Dieses Problem (der Post/Get-Übergang von Anfragen) wurde in anderen Threads diskutiert, wo es nach Spezifikation betrachtet wird, aber dennoch eine Verrücktheit.

Am Ende habe ich nur in den folgenden Segmenten in session.py in Anfragen gehackt:

def rebuild_method(self, prepared_request, response): 
    """When being redirected we may want to change the method of the request 
    based on certain specs or browser behavior. 
    """ 


    method = prepared_request.method 

    # http://tools.ietf.org/html/rfc7231#section-6.4.4 
    if response.status_code == codes.see_other and method != 'HEAD': 
     method = 'GET' 


    # Do what the browsers do, despite standards... 
    # First, turn 302s into GETs. 
    if response.status_code == codes.found and method != 'HEAD': 
     if method == 'POST': 
      #print ('\n\nDeliberately not changing to GET\n\n') 
     else: 
      method = 'GET' 

    # Second, if a POST is responded to with a 301, turn it into a GET. 
    # This bizarre behaviour is explained in Issue 1704. 
    if response.status_code == codes.moved and method == 'POST': 
     method = 'GET' 


    prepared_request.method = method 

Wo ich einfach nicht zu bekommen ändern.

Und auch hier:

def resolve_redirects(self, resp, req, stream=False, timeout=None, 
         verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): 

Wo ich auf Kommentar:

##   # https://github.com/requests/requests/issues/1084 
##   if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): 
##    # https://github.com/requests/requests/issues/3490 
##    print(prepared_request.headers) 
##    purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') 
##    for header in purged_headers: 
##     prepared_request.headers.pop(header, None) 
##    prepared_request.body = None 

Sicherlich ist dies die hässliche Hack, aber was hätte ich tun sollen? Hoffe, jemand hat einen Zeiger darauf.

Antwort

0

Wenn Sie keine Anfragen Bibliothek ändern möchten, können Sie für Umleitungen in Ihrem Code stattdessen überprüfen, hier ein Beispiel:

url = 'https://httpbin.org/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fpost' 
data = {'name': 'Hello'} 
while True: 
    rep = requests.post(url, data=data, allow_redirects=False) 
    if rep.status_code in [301, 302]: 
     url = rep.headers.get('location') 
     print 'redirect to', url 
     continue 
    break 

print rep.text 

Natürlich können Sie Endlosschleife Möglichkeit und andere HTTP-Status umgehen müssen Codes

+0

Ich bearbeitet meine Frage, ich war nicht klar genug. Das Problem ist in Sitzung, ich kenne die Methode, die Sie beschreiben. –

Verwandte Themen