it-roy-ru.com

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

Начиная с 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
18
kev

Ошибка You cannot access body after reading from request's 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, который обращается к request.POST (обычно) следует рассматривать как ошибка. Это означает, что представление не сможет установить пользовательскую загрузку обработчики, выполнять пользовательский анализ тела запроса или применять проверка разрешений перед загрузкой файлов.

22
Adam Easterling

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

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

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

7
Romeno

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

0
Sia