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?
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
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
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