2014-04-04 22 views
12

Küçük bir flask tabanlı site yazıyorum ve Ajax kullanarak istemciden sunucuya veri göndermek istiyorum. Şimdiye kadar sadece sunucudan veri almak için Ajax isteklerini kullandım. Bu sefer POST isteğiyle veri göndermek istiyorum.Flask ve Ajax Gönderi istekler 400

@app.route("/json_submit", methods=["POST"]) 
def submit_handler(): 
    # a = request.get_json(force=True) 
    app.logger.log("json_submit") 
    return {} 

ajax isteği göndererek, balon beni bir verir:

Bu

Ben ancak bu rotanın uygulanması dahilinde gereksiz hataları önlemek için bir ileti günlüğe azalttı, şişe tarafında alıcısı 400 hata

127.0.0.1 - - [03/Apr/2014 09:18:50] "POST /json_submit HTTP/1.1" 400 - 

Ben de

Neden şişesiaramıyor tarayıcıda web geliştirici konsolunda görebilirsiniztalepte verilen verilerle birlikte mi? kodunuzu dict nesnesi döndüren ise

var request = $.ajax({ 
    url: "/json_submit", 
    type: "POST", 
    data: { 
     id: id, 
     known: is_known 
    }, 
    dataType: "json", 
    }) 
    .done(function (request) { 
    }) 
+2

Flask-WTF'den CSRF korumasını bir ihtimalden mi kullanıyorsunuz? CSAF belirtecini AJAX isteğine dahil etmezseniz, 400 hatasıyla yanıt verir. –

+0

çözüm oldu.Eğer "kabul edilmiş bir cevap" için bu kadar istekli iseniz ve bunu tavsiye ederim;) – wirrbel

+1

Bu yorumu sizin için uygun bir cevaba dönüştürdüm. :-) –

cevap

21

gibi json döndürür.

muaf tutan bir dekoratör ile yapılır:

@csrf.exempt 
@app.route("/json_submit", methods=["POST"]) 
def submit_handler(): 
    # a = request.get_json(force=True) 
    app.logger.log("json_submit") 
    return {} 

AJAX istekleri ile kodu şu sayfanın herhangi bir yerinde jetonu arasına sokmak için; <meta> başlığında veya oluşturulan JavaScript'te, X-CSRFToken başlığını ayarlayın. JQuery'yi kullanırken, ajaxSetup hook'u kullanın.

<meta name="csrf-token" content="{{ csrf_token() }}"> 

bir yerlerinde JS kodu: bir meta etiketi (Şişe-WTF CSRF belgelerinden) kullanılarak

Örnek

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) 
     } 
    } 
}) 

aslında henüz JSON veri göndermek değil Sizin işleyicisi ; hala düzenli bir URL kodlanmış POST (veri Flask tarafında request.form içinde sona erecektir);

var request = $.ajax({ 
    url: "/json_submit", 
    type: "POST", 
    contentType: "application/json", 
    data: JSON.stringify({ 
    id: id, 
    known: is_known 
    }), 
}) 
    .done(function (request) { 
}) 

ve şimdi veri request.get_json() method ile bir Python yapı olarak erişilebilir: Eğer application/json için AJAX içerik türünü ayarlamak ve aslında JSON göndermek için JSON.stringify() kullanmak gerekir.

JSON için görünüşüdür döner (örneğin, bir JSON cevap üretmek için flask.json.jsonify() kullanılır) zaman $.ajax için dataType: "json", parametre sadece gereklidir. JQuery'nin cevabı nasıl işleyeceğini bilmesini sağlar.

+1

Kutsal moly, bu cevabın ilk cümlesi için teşekkür ederim. Bir görünümü (ana form) 'csrf.exempt' ile muaf tutmuştum ama aynı dekoratörü AJAX aracılığıyla çağrılan gerçek 'upload'im görünümüne eklemeyi unutmuştum. İlk cümlenin bir şekilde okunması bir şekilde ampulden çıkmıştı :) – sofly

+1

Teşekkürler! Bana çok yardımcı ol. – sudoz

+1

Bu bana çok yardımcı oldu. Tam doğruda. Verileri – tver3305

1

Eğer Bundan önce bu

var request = $.ajax({ 
    url: "/json_submit", 
    type: "POST", 
    contentType: "application/json", 
    data: JSON.stringify({ 
     id: id, 
     known: is_known 
    }), 
    dataType: "json", 
    }) 
    .done(function (request) { 
}) 

gibi deneyebilir miyim. Bu doğru değil. Eğer Flask-WTF CSRF protection Eğer görünümünüzü muaf yapmalı ya ya da çok AJAX POST isteği CSRF belirteci ekleriz kullanıyorsanız O

@app.route("/json_submit", methods=["POST"]) 
def submit_handler(): 
    # a = request.get_json(force=True) 
    app.logger.log("json_submit") 
    return flask.jsonify({'msg': 'success'}) 
İlgili konular