2017-09-11 1 views
-1

J'essaie d'écrire une petite application api reposant, j'utilise l'extension Chrome Postman pour envoyer des demandes à l'application.Pourquoi je reçois une erreur 400 Bad Request lors de l'envoi de données json dans Flask?

Je crois que mon code ne trompe pas, mais chaque fois que je vous envoie la demande de poste un 400 Bad Request erreur levée, voici mon code:

@api_route.route('/api', methods=['GET']) 
def api(): 
    return jsonify({'message':'Api v1.0'}) 

@api_route.route('/api', methods=['POST']) 
def create_user(): 
    data = request.get_json() 
    if data: 
     hashed_password = generate_password_hash(data['password'], method='sha256') 
     api = Api(email=data['email'], password=hashed_password) 
     db.session.add(api) 
     db.session.commit() 
     return jsonify({'message', 'New User Created!'}) 

Les données JSON que je vous envoie des regards comme ceci:

{"email" : "Test", "password" : "123123123"}

Pourquoi je reçois le 400 erreur ??

Mise à jour:

Captures d'écran pour les requêtes à l'aide Postman:

GET Demande GET Request

POST Demande POST Request

Ici i je suis initiation route api à l'intérieur contrôleur api:

from flask import Blueprint 
api_route = Blueprint(
    'api', 
    __name__ 
) 
from . import views 

alors je suis inscris à l'intérieur def create_app() fonction:

from .api import api_route 
app.register_blueprint(api_route) 

Voici les extensions que j'utilise dans mon application:

toolbar = DebugToolbarExtension() 
assets_env = Environment() 
cache = Cache() 
moment = Moment() 
htmlminify = HTMLMIN() 
csrf = CSRFProtect() 
jac = JAC() 
googlemap = GoogleMaps() 
session = Session() 
principal = Principal() 
+0

Quel est le chemin à votre demande? – MrPyCharm

+0

@MrPyCharm, http: // localhost: 5000/api – reznov11

+0

Pouvez-vous remplacer 'return jsonify ({'message', 'Nouvel utilisateur créé!'})' Avec 'return jsonify ({'message': 'Nouvel utilisateur créé!'}) 'et essayez-le? – MrPyCharm

Répondre

1

Une bonne approche consisterait à structurer vos vues comme suit:

Au lieu de créer vue avec la même voie pour les différentes méthodes de demande, vous pouvez gérer les méthodes de demande dans la même vue:

@api_route.route('/api', methods=['GET', 'POST']) 
def api(): 
    if request.method == 'GET': 
     return jsonify({'message':'Api v1.0'}) 

    else: 
     data = request.get_json(force=True) 
     if data: 
      hashed_password = generate_password_hash(data['password'], method='sha256') 
      api = Api(email=data['email'], password=hashed_password) 
      db.session.add(api) 
      db.session.commit() 
      return jsonify({'message': 'New User Created!'}) 

     # Just in case the if condition didn't satisfy 
     return None 
+0

Tout d'abord merci pour votre intérêt mec, mais rien n'a changé l'erreur soulevant encore, je suis vraiment confus pourquoi cela ne fonctionnera pas ??, j'ai tapé une autre petite liste api todo mois et le code n'a pas changé, sauf les noms des routes! – reznov11

+0

Eh bien, l'extrait ci-dessus fonctionne très bien sur mon système. Vous pouvez également vérifier l'appel 'Api' que vous faites, qui pourrait causer le problème – MrPyCharm

+0

Si l'objet Api causant le problème, il devrait retourner une erreur qui dit par exemple que quelque chose s'est passé pendant que les données sont insérées dans la base de données, mais ici l'erreur immédiatement si j'envoie une demande POST !! – reznov11

2

J'ai résolu le problème, j'ai lancé CSRFProtect avec application donc je dois inclure X-CSRFToken dans toutes mes demandes, j'ai donc deux choix:

1 - pour inclure le csrf_token dans request.headers pour toutes les demandes

2 - en utilisant @csrf.exempt décorateur qui vient avec flask_wtf.csrf

Pour l'instant je suis en utilisant @csrf.exempt, il se présente comme suit:

@api_route.route('/api', methods=['GET','POST']) 
@csrf.exempt 
def create_user(): 
    if request.method == 'GET': 
     return jsonify({'message' : 'API v1.0'}) 
    elif request.method == 'POST': 
     data = request.get_json() 
     hashed_password = generate_password_hash(data['password'], method='sha256') 
     new_user_api = Api(email=data['email'], password=hashed_password) 
     db.session.add(new_user_api) 
     db.session.commit() 
     return jsonify({'message' : 'New user created!'}) 
    return return jsonify({'message' : 'No user has been added!'}) 

Merci pour @MrPyCharm pour ses intérêts, salut :).