web-dev-qa-db-fra.com

Flask, comment retourner un code d'état de réussite pour un appel ajax

Côté serveur, j'imprime simplement le json-as-dictionary sur la console

@app.route('/',methods=['GET','POST'])
@login_required
def index():
    if request.method == "POST":
        print request.json.keys()
    return "hello world"

Maintenant, chaque fois que je fais une demande de publication via ajax, la console imprime le dictionnaire avec le contenu dont j'ai besoin.

Côté client, j'ai essayé d'utiliser différentes méthodes pour exécuter des requêtes basées sur un appel ajax réussi. Je viens de réaliser que cela pourrait être une erreur côté serveur, c'est-à-dire que je n'envoie aucun en-tête de demande pour dire à jquery que son appel ajax a été un succès.

Alors, comment envoyer un statut OK à mon client pour lui dire que tout va bien?

Par souci d'exhaustivité, voici mon code côté client

$.ajax({
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(myData),
    dataType: 'json',
    url: '/',
    success: function () {
        console.log("This is never getting printed!!")
    }});
44
yayu

À propos des réponses dans la fiole:

À propos des réponses

La valeur de retour d'une fonction d'affichage est automatiquement convertie en un objet de réponse pour vous. Si la valeur de retour est une chaîne, elle est convertie en objet de réponse avec la chaîne comme corps de réponse, un 200 OK code d'état et text/html mimetype. La logique que Flask s'applique à la conversion des valeurs de retour en objets de réponse est la suivante:

  1. Si un objet de réponse du type correct est renvoyé, il est directement renvoyé de la vue.
  2. S'il s'agit d'une chaîne, un objet de réponse est créé avec ces données et les paramètres par défaut.
  3. Si un tuple est retourné, les éléments du tuple peuvent fournir des informations supplémentaires. Ces tuples doivent être sous la forme (response, status, headers) ou (response, headers) où au moins un élément doit être dans le tuple. La valeur status remplacera le code d'état et headers peut être une liste ou un dictionnaire de valeurs d'en-tête supplémentaires.
  4. Si rien de tout cela ne fonctionne, Flask supposera que la valeur de retour est une application WSGI valide et la convertira en objet de réponse.

Donc, si vous retournez une chaîne de texte (comme vous le faites), le code d'état que votre AJAX doit recevoir est 200 OK, et votre rappel de réussite doit être en cours d'exécution. Cependant, je vous recommande de renvoyer une réponse au format JSON comme:

return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 
55
aabilio

En option pour réponse d'Aabilio , vous pouvez utiliser la méthode jsonify dans Flask qui définit automatiquement le Content-Type:

from flask import jsonify

resp = jsonify(success=True)
return resp

Vous pouvez (facultativement) définir explicitement le code de réponse:

resp.status_code = 200
15
Philip Bergström

En plus des réponses déjà publiées, je trouve en utilisant le make_response méthode dans Flask (à partir de la version 0.6) pour être une alternative plus claire, en particulier lorsque vous devez renvoyer des codes d'état avec la réponse JSON pour les API de Flask:

from flask import jsonify, make_response

# ... other code ...
data = {'message': 'Created', 'code': 'SUCCESS'}
return make_response(jsonify(data), 201)

De plus, cette approche définira automatiquement le Content-Type en-tête à application/json.

2
seyisulu