web-dev-qa-db-fra.com

Comment obtenir POSTed JSON en Flask?

J'essaie de créer une API simple à l'aide de Flask, dans laquelle je veux maintenant lire du JSON POSTé. Je fais le post avec le extension PostMan Chrome , et le JSON que je publie est tout simplement {"text":"lalala"}. J'essaie de lire le JSON en utilisant la méthode suivante:

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content
    return uuid

Sur le navigateur, il renvoie correctement l'uuid que j'ai placé dans GET, mais sur la console, il imprime simplement None (où je m'attends à ce qu'il imprime le {"text":"lalala"}. Quelqu'un sait-il comment obtenir le code JSON publié à partir de la méthode Flask? ?

244
kramer65

Tout d’abord, l’attribut .json est une propriété qui délègue à la méthode request.get_json() , qui explique pourquoi vous voyez Noneici.

Vous devez définir le type de contenu de la demande sur application/json pour que la propriété .json et la méthode .get_json() (sans argument) fonctionnent, car sinon, Nonesera produit. Voir la documentation Flask Requestname__ :

Cela contiendra les données JSON analysées si le type MIME indique JSON ( application/json , voir is_json() ), sinon ce sera Nonename__.

Vous pouvez indiquer à request.get_json() d'ignorer l'exigence de type de contenu en lui transmettant l'argument de mot clé force=True.

Notez que si une exception est déclenchée à ce stade (entraînant éventuellement une réponse de 400 requêtes incorrectes), votre JSON les données sont invalides. C'est en quelque sorte malformé; vous voudrez peut-être vérifier avec un validateur JSON.

339
Martijn Pieters

Pour référence, voici le code complet expliquant comment envoyer un JSON depuis un client Python:

import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
    print res.json()

L'entrée "json =" définira automatiquement le type de contenu, comme indiqué ci-après: Publication JSON à l'aide de requêtes Python

Et le client ci-dessus fonctionnera avec ce code côté serveur:

from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content['mytext']
    return jsonify({"uuid":uuid})

if __== '__main__':
    app.run(Host= '0.0.0.0',debug=True)
67
Luke

C’est comme ça que je le ferais et ça devrait être

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.get_json(silent=True)
    # print(content) # Do your processing
    return uuid

Lorsque silent=True est défini, la fonction get_json échouera de manière silencieuse lors de la tentative d'extraction du corps json. Par défaut, la valeur est Falsename__.

Le réglage de force=True ignorera la vérification request.headers.get('Content-Type') == 'application/json' que le flacon effectue pour vous. Par défaut, la valeur est également Falsename__.

Voir documentation du flacon .

Je recommande fortement de laisser force=False et de faire en sorte que le client envoie l'en-tête Content-Type pour le rendre plus explicite.

J'espère que cela t'aides!

58
radtek

Cette solution fonctionne:

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/hello', methods=['POST'])
def hello():
   return jsonify(request.json)
15
trojek

Nous pouvons utiliser les paramètres pour résoudre les données JSON

import flask
from flask import request, jsonify
import Parameters

application = flask.Flask(__name__)

@application.route('/myappp', methods=['POST'])
    @cross_Origin('*')
    def User_details_by_mailID():
        payload = request.get_json()
        email = payload[Parameters.email]
        return jsonify(email)
0
Aakash Handa