2017-09-29 14 views
0

Suite à la documentation de flask-wtf (version 0.14.2, python 3.4.6) here j'obtiens une erreur CSRF token is missing 400 en réagissant sur un événement onchange à partir d'un simple bouton radio.Le jeton CSFF Flask-WTF est manquant

<script type="text/javascript"> 
// Send the status of the radio buttons using AJAX 
function radio_changed(){ 
    var csrf_token = "{{ csrf_token() }}"; 

    $.ajaxSetup({ 
     beforeSend: function(xhr, settings) { 
      if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) { 
       xhr.setRequestHeader("X-CSRFToken", csrf_token); 
      } 
     } 
    }); 
    var radioValue = $("input[class=radios]:checked").val(); 
    //alert(radioValue); 
    $.ajax({ 
        url: '/_radio_update', 
        data: {value:radioValue}, 
        type: 'POST', 
        success: function(response){ 
          console.log(response); 
        }, 
        error: function(error){ 
          console.log(error); 
        } 
      }); 
} 
</script> 

puis plus tard

<form method=post action=""> 
{{ form.csrf_token }} 
... 

sur le côté Flask:

... 
from flask_wtf.csrf import CSRFProtect 

app = Flask(__name__) 
app.secret_key = 'shhhhhhh!' 
csrf = CSRFProtect(app) 

@app.route('/_radio_update', methods=['GET', 'POST']) 
def _radio_update(radiostatus): 
    print(radiostatus) 
... 

suis-je manque quelque chose?

+0

Le navigateur envoie-t-il réellement le jeton? Vérifiez l'onglet réseau dans vos outils de développement. Si ce n'est pas le cas, est-ce parce que 'this.crossDomain' est vrai? – kichik

+0

Sous réseau -> en-têtes -> en-têtes de requête je vois seulement un cookie de session, pas de jetons. J'ai aussi essayé avec 'crossDomain: false' avec les mêmes résultats. Aussi essayé 'jsonp' comme décrit dans ce [tutoriel] (https://d-mueller.de/blog/cross-domain-ajax-guide/) n'a pas non plus aidé. Pouvez-vous élaborer s'il vous plaît? – xaratustra

+0

Si le serveur dit qu'il ne peut pas voir le jeton CSRF, il n'est pas là ou il y a un bogue dans le serveur. Nous l'avons juste réduit au jeton pas là et spécifiquement le navigateur ne l'envoyant pas. Ensuite, vous pouvez suivre le JavaScript ligne par ligne pour voir ce qui ne va pas comme prévu. – kichik

Répondre

1

Il semble qu'il y ait une différence entre Forms importée de wtforms et celui importé de flask.ext.wtf qui, selon la note à la fin de l'documentation provoque le problème.

Après avoir traité l'avis de la dévalorisation, enfin je l'ai changé la ligne:

from wtforms import Form, RadioField, SubmitField, validators 
class InputForm(Form): 
... 

à

from wtforms import RadioField, SubmitField, validators 
from flask_wtf import FlaskForm 
class InputForm(FlaskForm): 
... 

cette résolu le problème pour moi.