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? ?
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 None
ici.
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, None
sera produit. Voir la documentation Flask Request
name__ :
Cela contiendra les données JSON analysées si le type MIME indique JSON ( application/json , voir
is_json()
), sinon ce seraNone
name__.
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.
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)
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 False
name__.
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 False
name__.
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!
Cette solution fonctionne:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/hello', methods=['POST'])
def hello():
return jsonify(request.json)
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)