0

Wir haben einige benutzerdefinierte Modul, wo wir open, seek, read, tell Funktionen neu definiert haben nur einen Teil der Datei gemäß den Argumenten zu lesenWie kann man Python-Anfragen nicht die Länge des Inhalts berechnen lassen und die bereitgestellte verwenden?

Aber, überschreibt diese Logik den Standard tell und Python requests versucht, den Content-Length zu berechnen, die tell() mit beinhaltet, die dann auf unsere eigenen tell Funktion leitet und die Logik ist irgendwo Buggy und gibt einen falschen Wert. Und ich habe einige Änderungen versucht, es löst Fehler aus.

fanden die folgende von models.py von Anfragen:

def prepare_content_length(self, body): 
     if hasattr(body, 'seek') and hasattr(body, 'tell'): 
      body.seek(0, 2) 
      self.headers['Content-Length'] = builtin_str(body.tell()) 
      body.seek(0, 0) 
     elif body is not None: 
      l = super_len(body) 
      if l: 
       self.headers['Content-Length'] = builtin_str(l) 
     elif (self.method not in ('GET', 'HEAD')) and (self.headers.get('Content-Length') is None): 
      self.headers['Content-Length'] = '0' 

Vorerst bin ich nicht in der Lage den Fehler, um herauszufinden, wo ist und gestresst mehr zu untersuchen und zu beheben. Und alles andere funktioniert außer der Berechnung der Inhaltslänge durch Python-Anfragen.

Also habe ich meine eigene Definition für das Finden von Content-Länge erstellt. Und ich habe den Wert in Requests Header aufgenommen. Aber die Anfrage bereitet immer noch den Inhaltslängen- und Wurffehler vor.

Wie kann ich einschränken nicht vorbereitend content-length und verwenden Sie die angegebene content-length?

+1

Nun, Sie ändern Standardfunktionen und -methoden. Wie können Sie erwarten, dass die Dinge richtig funktionieren? –

+0

@AndreaCorbellini Hallo, ja, du hast Recht. Dies ist jedoch erforderlich, damit wir eine Datei in mehrere Teile aufteilen und hochladen können. Nun, es ist schon so lange dort. Und kürzlich haben wir von urllib2 auf Anfragen umgestellt, so dass wir jetzt auf diesen Fehler stießen. –

Antwort

3

Anfragen können Sie eine Anfrage vor dem Senden ändern. Siehe Prepared Requests.

Zum Beispiel:

from requests import Request, Session 

s = Session() 

req = Request('POST', url, data=data, headers=headers) 
prepped = req.prepare() 

# do something with prepped.headers 
prepped.headers['Content-Length'] = your_custom_content_length_calculation() 

resp = s.send(prepped, ...) 

Wenn Ihre Sitzung seine eigene Konfiguration hat (wie Cookie-Persistenz oder verbindungs ​​Pooling), dann sollten Sie s.prepare_request(req) statt req.prepare() verwenden.

+0

Oh ja, ich habe es gelesen. Bus hat sich falsch verstanden. Jetzt ist es klar .. Danke! .. :) –

Verwandte Themen