0

我們有一些自定義模塊,我們已經重新定義了open,seek,read,tell函數根據參數只讀取文件的一部分。如何不讓python請求計算內容長度並使用提供的內容?

但是,這個邏輯覆蓋默認tell和python requests試圖計算內容長度,其中包括使用tell(),然後重定向到我們的自定義tell功能和邏輯是介於越野車,並返回一個錯誤值。我嘗試了一些更改,它會引發錯誤。

發現從請求models.py如下:

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' 

現在,我無法找出其中的錯誤,並強調了進行深入調查以解決它。除了python請求的內容長度計算以外,其他所有工作都是有效的。

所以,我創建了我自己的定義來查找內容長度。我已經在請求頭中包含了這個值。但是,該請求仍在準備內容長度和投擲錯誤。

如何限制不準備內容長度並使用指定的內容長度?

+1

那麼,你正在改變標準的功能和方法。你怎麼能期望事情正常工作? –

+0

@AndreaCorbellini嗨,是的,你說得對。但是,我們需要將文件拆分爲多個部分並上傳。那麼,它在那裏已經很久了。最近,我們已經從urllib2切換到了請求,所以現在我們遇到了這個錯誤。 –

回答

3

通過請求可以在發送前修改請求。請參閱Prepared Requests

例如:

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

如果您的會話都有自己的配置(如Cookie持久性和連接池),那麼你應該使用s.prepare_request(req)而不是req.prepare()

+0

哦,是的,我讀過它。公共汽車誤以錯誤的方式。現在很清楚..謝謝!:) –