Solución:
Si está utilizando la protección CSRF de Flask-WTF, deberá eximir su vista o incluir el token CSRF en su solicitud POST de AJAX también.
La exención se realiza con un decorador:
@csrf.exempt
@app.route("/json_submit", methods=["POST"])
def submit_handler():
# a = request.get_json(force=True)
app.logger.log("json_submit")
return {}
Para incluir el token con solicitudes AJAX, interpole el token en la página en algún lugar; en un <meta>
encabezado o en JavaScript generado, luego establezca un X-CSRFToken
encabezamiento. Cuando use jQuery, use el ajaxSetup
gancho.
Ejemplo usando una etiqueta meta (de la documentación CSRF de Flask-WTF):
<meta name="csrf-token" content="{{ csrf_token() }}">
y en tu código JS en algún lugar:
var csrftoken = $('meta[name=csrf-token]').attr('content')
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
})
Su controlador todavía no publica datos JSON; sigue siendo una URL normal codificada POST
(los datos terminarán en request.form
en el lado del matraz); tendrías que configurar el tipo de contenido AJAX en application/json
y use JSON.stringify()
para enviar JSON:
var request = $.ajax({
url: "/json_submit",
type: "POST",
contentType: "application/json",
data: JSON.stringify({
id: id,
known: is_known
}),
})
.done( function (request) {
})
y ahora se puede acceder a los datos como una estructura de Python con el request.get_json()
método.
los dataType: "json",
parámetro a $.ajax
solo es necesario cuando tu vista devoluciones JSON (por ejemplo, usaste flask.json.jsonify()
para producir una respuesta JSON). Le permite a jQuery saber cómo procesar la respuesta.