Исключение: вы не можете получить доступ к телу после чтения из потока данных запроса

Поскольку исходные данные Django 1.5 доступны через request.body.

В моем приложении я иногда получаю передачу данных через форму и иногда необработанные данные (например, json). Есть ли способ написать такую ​​функцию, которая не терпит неудачу?

def get_post_var(request, name):
    result = request.POST.get(name)
    if result:
        return result

    post_body = dict(urlparse.parse_qsl(request.body))
    result = post_body.get(name)
    if result:
        return result

    return None

Ответ 1

Ошибка запроса You cannot access body after reading from request data stream будет вызвана при запросе, если (1) этот метод запроса POST, (2), к которому запрашивается словарь POST-запроса в промежуточном программном обеспечении, в process_request или process_view и (3) в пределах доступна функция просмотра, request.body. Он включен (3), что ошибка будет поднята, хотя реальной причиной ошибки является (2).

Чтобы устранить эту ошибку, вам нужно изучить ваше промежуточное программное обеспечение для доступа к request.POST и изменить его таким образом, чтобы он больше не обращался к request.POST.

Документы Django говорят, что промежуточное ПО не должно иметь доступ к request.POST, и это является одним из последствий игнорирования этой рекомендации.

Также просмотрите этот билет Django по проблеме, который включает примечание:

[M] iddleware, который обращается к запросу. POST следует (обычно) считать ошибка. Это означает, что представление не сможет установить какую-либо пользовательскую загрузку обработчиков, выполнять индивидуальный анализ тела запроса или применять проверки разрешений до приема файлов.

Ответ 2

Добавляя к Адаму Истринцу ответ, стоит отметить, что сам Django нарушает" подсказку не, используя запрос .POST в промежуточном программном обеспечении:

Класс CsrfViewMiddleware можно считать исключением, поскольку он предоставляет декодеры csrf_exempt() и csrf_protect(), которые позволяют взглядов, чтобы явно контролировать, в какой момент проверка CSRF должна происходят.

Который не дезинфицирует нарушение IMO

Ответ 3

Используйте request.data вместо request.body.

request.data больше не читает поток данных.

Ответ 4

Я смог прочитать свой запрос .POST после помещения @csrf_exempt перед моей функцией просмотра. Поскольку промежуточное программное обеспечение CSRF обращается к данным POST.

Ответ 5

Для тех с той же ошибкой, которые не готовят тело или POST, у меня была такая же ошибка, когда я использовал эту строку кода в промежуточном программном обеспечении process_view ::

   event = request.event if 'event' in request else None

Решено настройками request.event = Нет в верхней части функции, чтобы я мог затем использовать:

    event = request.event

Ответ 6


def get_request_body(request):
    if hasattr(request, '_body'):
        return request._body
    return request.body