Исключение: вы не можете получить доступ к телу после чтения из потока данных запроса
Поскольку исходные данные 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