web-dev-qa-db-fra.com

Exception: vous ne pouvez pas accéder au corps après avoir lu le flux de données de la demande

Depuis Django 1.5, les données de publication brutes sont accessibles via request.body.

Dans mon application, je reçois parfois des données via un formulaire et parfois des données brutes (json par exemple). Y a-t-il un moyen d'écrire une fonction comme celle-ci qui ne manque pas?

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

L'erreur You cannot access body after reading from request's data stream sera déclenchée sur une demande si (1) cette méthode de demande est POST, (2) le dictionnaire POST de cette demande est utilisé dans le middleware, en process_request ou process_view et (3) dans la fonction d'affichage , request.body est consulté. C'est sur (3) que l'erreur sera déclenchée, même si la cause réelle du bogue est (2).

Afin de résoudre l'erreur, vous devez examiner votre middleware pour savoir où il accède à request.POST et le modifier de sorte qu'il n'accède plus à request.POST.

Les documents Django disent que le middleware ne devrait pas accéder à request.POST , ce qui est une conséquence du non-respect de cette recommandation.

Consultez également ce billet Django sur le numéro , qui inclut la note:

[M] iddleware qui frappe request.POST devrait (généralement) être considéré comme un bogue . Cela signifie que la vue ne pourra pas définir de gestionnaires de téléchargement personnalisé , Effectuer une analyse syntaxique personnalisée du corps de la demande ou appliquer des vérifications d'autorisation Avant l'acceptation des téléchargements de fichiers.

22
Adam Easterling

En ajoutant à la réponse d'Adam Easterling, il convient de noter que Django lui-même ' viole ' l'allusion de not using request.POST dans le middleware:

La classe CsrfViewMiddleware peut être considérée comme une exception, car elle Fournit les décorateurs csrf_exempt () et csrf_protect () qui permettent aux vues De contrôler explicitement à quel moment la validation du CSRF doit .

Ce qui ne désinfecte pas l'infraction de l'OMI

7
Romeno

J'ai pu lire ma requête.POST après avoir placé @csrf_exempt avant ma fonction de vue. Parce que le middleware CSRF accède à POST données.

0
Sia