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
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.
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
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.