web-dev-qa-db-fra.com

Flask request et type de contenu application / json

J'ai une application flask avec la vue suivante:

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.json)

Cependant, cela ne fonctionne que si le type de contenu de la demande est défini sur application/json, sinon le dict request.json est Aucun.

Je le sais request.data a le corps de la requête sous forme de chaîne, mais je ne veux pas l'analyser en dict chaque fois qu'un client oublie de définir le type de contenu de la requête.

Existe-t-il un moyen de supposer que le type de contenu de chaque demande entrante est application/json? Tout ce que je veux, c'est avoir toujours accès à un request.json dict, même si le client oublie de définir le type de contenu de l'application sur json.

25
danielrvt

Utilisez request.get_json() et définissez force sur True:

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.get_json(force=True))

De la documentation:

Par défaut, cette fonction ne chargera les données json que si le mimetype est application/json mais cela peut être remplacé par le paramètre force.

Paramètres:

  • force - si défini sur Vrai le type MIME est ignoré.

Pour les anciennes versions Flask, <0.10, si vous voulez pardonner et autoriser JSON, toujours, vous pouvez faire le décodage vous-même, explicitement:

from flask import json

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(json.loads(request.data))
51
Martijn Pieters

l'objet request possède déjà une méthode get_json qui peut vous donner le json quel que soit le type de contenu si vous l'exécutez avec force=True pour que votre code ressemble à ceci:

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.get_json(force=True))

en fait, la documentation flask indique que request.get_json doit être utilisé à la place de request.json: http://flask.pocoo.org/docs/api/?highlight=json#flask.Request.json

12
josebama