Saltar al contenido

Error de solicitud incorrecta de Flask y Ajax Post HTTP 400

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *