0

open, seek, read, tell yeniden tanımladığımız bazı özel modüllerde, bağımsız değişkenlere göre dosyanın yalnızca bir kısmını okumak için işlevler vardır.Python isteklerinin içerik uzunluğunu nasıl hesaplamasına izin vermez ve sağlananı kullanır?

Ama bu mantık varsayılan tell geçersiz kılar ve piton requests sonra bizim özel tell işlevine yönlendirir ve mantık bir yere arabası ve yanlış değerini döndüren tell() kullanmayı gerektirir içerik uzunlukta hesaplamak için çalışıyor. Ve bazı değişiklikler denedim, hata veriyor.

istekleri models.py aşağıdaki Bulunan: Ben anlamaya muktedir değilim Şimdilik

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' 

nerede hata var ve daha araştırmak ve bunu düzeltmek için stresli. Ve her şey python istekleri tarafından içerik uzunluk hesaplaması dışında çalışır.

Bu yüzden içerik uzunluğunu bulmak için kendi tanımımı oluşturdum. Ve istekleri başlık değerine dahil ettim. Ancak, istek hala içerik uzunluğu ve atma hatası hazırlanıyor.

İçerik uzunluğu hazırlama ve belirtilen içerik uzunluğunu kullanma konusunda nasıl kısıtlama yapabilirim?

+1

Standart işlevleri ve yöntemleri değiştiriyorsunuz. İşlerin doğru bir şekilde çalışmasını nasıl bekleyebilirsiniz? –

+0

@AndreaCorbellini Merhaba, evet haklısınız. Ancak, bu bir dosyayı birden çok parçaya bölmek ve yüklemek için gereklidir. Eh, o kadar uzun zamandır orada. Son zamanlarda, urllib2'den isteklere geçiş yaptık, bu yüzden şimdi bu hatayla karşılaştık. –

cevap

3

İstekler, göndermeden önce bir isteği değiştirmenizi sağlar. Bakınız Prepared Requests. Örneğin

:

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, ...) 

oturumunuz (çerez kalıcılığı veya bağlantı-havuzlama gibi) kendi yapılandırma, o zaman s.prepare_request(req) yerine req.prepare() kullanmalıdır.

+0

Oh evet, okudum. Otobüs yanlış şekilde yanlış anlaşıldı. Şimdi açık .. teşekkürler! .. :) –

İlgili konular