Как не позволить 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(),

Другие вопросы по тегам