0

openseekreadtellは、引数に応じてファイルの一部のみを読み込む関数を定義しています。pythonリクエストでcontent-lengthを計算させ、指定されたものを使用させるにはどうすればいいですか?

しかし、このロジックは、デフォルト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リクエストによるコンテンツ長の計算を除いて動作します。

私はコンテンツ長を見つけるための独自の定義を作成しました。そして私はリクエストヘッダーに値を含めました。しかし、要求はまだコンテンツ長さと投げエラーを準備しています。

content-lengthを準備しないように制限し、指定されたcontent-lengthを使用するにはどうすればよいですか?

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

あなたのセッションは(クッキーの永続性や接続プーリングなど)、独自の構成を有している場合は、s.prepare_request(req)の代わりreq.prepare()を使用する必要があります。

+0

ああ、私はそれを読んだ。バスが間違った方法で間違っていた。今それは明らかです.thanks!.. :) –