web-dev-qa-db-fra.com

Essayer d'analyser `request.body` à partir de POST dans Django

Pour une raison quelconque, je ne peux pas comprendre pourquoi Django ne gère pas correctement mon contenu request.body.

Il est envoyé au format JSON, et en regardant l'onglet Network dans les outils de développement, affiche ceci comme charge de la requête:

{creator: "creatorname", content: "postcontent", date: "04/21/2015"}

c'est exactement ce que je veux qu'il soit envoyé à mon API.

Dans Django j'ai une vue qui accepte cette demande en tant que paramètre et, à mes seules fins de test, je devrais imprimer request.body["content"] Sur la console.

Bien sûr, rien n’est imprimé, mais quand j’imprime request.body, J’obtiens ceci:

b'{"creator":"creatorname","content":"postcontent","date":"04/21/2015"}'

donc je sais que j'ai do avoir un corps envoyé.

J'ai essayé d'utiliser json = json.loads(request.body) en vain. Imprimer json après avoir défini cette variable ne renvoie également rien.

45
Zach

Dans Python 3.0 à Python 3.5.x, json.loads()] n'accepte qu'une chaîne de caractères unicode. Vous devez donc décoder request.body (qui est une chaîne d'octets) avant de la transmettre à json.loads().

body_unicode = request.body.decode('utf-8')
body = json.loads(body_unicode)
content = body['content']

Dans Python 3.6, json.loads() accepte les octets ou bytearrays) . Par conséquent, vous ne devriez pas avoir besoin de décoder request.body (En supposant qu'il soit codé UTF-8, UTF-16 ou UTF-32).

123
Alasdair