Как не позволить Python-запросам вычислять контент-длину и использовать предоставленный?
У нас есть какой-то пользовательский модуль, в котором мы переопределили open
, seek
, read
, tell
функции для чтения только части файла в соответствии с аргументами.
Но эта логика переопределяет значение по умолчанию tell
и питон 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 ответ
Запросы позволяет вам изменить запрос перед отправкой. Смотрите подготовленные запросы.
Например:
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()
,