web-dev-qa-db-fra.com

L'application Flask génère une erreur 500 sans exception

Cela fait un certain temps que je me tape la tête contre cette méthode dans Flask, et même s'il semble que je progresse maintenant, je viens de tomber sur quelque chose qui me laisse perplexe. Voici la méthode que j'appelle:

@app.route('/facedata/<slug>', methods=["POST"])
def facedata(slug):
    if request.method == "POST":
        try:
            post = Post.objects.get_or_404(slug=slug)
            data = [float(item) for item in request.form.getlist('emotions[]')]
            post.face_data.append(data)
            post.save()
        except:
            traceback.print_exc(file=sys.stdout)

Pendant longtemps, j'ai eu des erreurs ici qui seraient ensuite prises dans les journaux de heroku. Actuellement, il n'y a pas d'erreur, ce qui implique qu'elle n'atteint pas la boucle d'exception, mais pire encore, il y a encore 500 erreurs. Plus précisément les 500 erreurs que je reçois sont:

heroku[router]: at=info method=POST path=/facedata/StripedVuitton Host=cryptic-mountain-6390.herokuapp.com fwd="18.111.90.180" dyno=web.2 connect=4ms service=39ms status=500 bytes=291

J'envoie ces requêtes POST via AJAX avec cette méthode:

var slug = document.getElementById("hidden-slug").getAttribute("value");
data = {emotions: lRes};
$.ajax({
    type: "POST",
    data: data,
    url: document.location.Origin + "/facedata/" + slug,
    success: function(){
        console.log("Success!");
    }
});

Très honnêtement, je ne sais tout simplement pas comment continuer à résoudre ce problème. Cela n’a pas beaucoup de sens pour moi d’obtenir une trace sans exception, mais peut-être que je suis juste naïf.

J'utilise mongoengine au-dessus de MongoHQ sur Heroku si cela est pertinent.

29
Slater Victoroff

Après avoir heurté ma tête un peu plus, j'ai finalement compris grâce aux gens formidables du groupe pocoo google (j'ai appris depuis qu'il existe une liste séparée pour les flasques). Tout d'abord, je devais activer l'option PROPAGATE_EXCEPTIONS dans la configuration de mon application ( http://flask.pocoo.org/docs/config/#builtin-configuration-values ​​ ).

Après cela, j’ai réalisé qu’il y avait un problème avec le fait de ne pas renvoyer de réponse à partir d’une fonction de vue. Flask a alors interprété cette méthode. Comme c'était le cas, ce problème a été résolu en ajoutant simplement:

return jsonify(result={"status": 200})

À la fin du bloc try. J'espère que cela aidera quelqu'un dans une situation similaire à l'avenir.

46
Slater Victoroff

J'avais le même problème, mais la cause sous-jacente était différente de celle contenue dans la réponse de Slater: 

Je mettais en sourdine l'enregistreur auquel la trace de pile va. Assurez-vous de ne pas filtrer le consignateur flask.app, qui est le lieu de destination des traces de la pile d'exceptions (notez que cela est différent des journaux d'informations du serveur de flacon, nommé app.api).

0
Vito