4

djangoバックエンドからajax投稿データを取得する際に問題が発生しました。値を渡す方法がわかりません。助けてください。

htmlでは私は単にこれを持っています:

<form id="get_vulns_from_family">
    <label for="family_content">Enter a family name to display the NVTs</label>
    <input id="family_content" />
    <input type="submit" value="search" />
</form>

javascriptで私はこれを書きました:

$(function() {
    $("#get_vulns_from_family").submit(function(event) {
        var family_text = $("#family_content").val();
        var family_data = {"family": family_text};
        $.ajax({
            url: "/template_conf/get_vulns_from_family",
            type: "POST",
            data: family_data,
            success: function(response) {
                console.log(response);
            },
            error: function(response) {
                console.log("failed!");
            }
        });
        // prevent default posting of form
        event.preventDefault();
    });
});

urlに対応するDjangoメソッド/template_conf/get_vulns_from_familyで、私はこれを試しました:

def get_vuln_from_family(request):
    family = request.POST['family']
    # some other operations to get value for variable "json_data"
    return HttpResponse(simplejson.dumps(json_data))

しかし、djangoは次MultiValueDictKeyError: "Key 'family' not found in <QueryDict: {}>"のように述べています。これは、POST辞書が空であることを意味します。投稿データを取得するために間違った方法を使用していますか?もしそうなら、私は何をすべきですか?ありがとう。

4

2 に答える 2

10

URL"/template_conf/get_vulns_from_family"に末尾のスラッシュがありません。djangoは通常、これをにリダイレクトし、データ"/template_conf/get_vulns_from_family/"をドロップしますPOST

于 2012-12-05T20:37:02.850 に答える
0

CSRFが有効になっている場合、単純なajax投稿は機能しません。csrfトークンを追加し、それをajaxリクエストヘッダーに設定する必要があります。

Ajax POSTリクエストの場合、すべてのPOSTリクエストでCSRFトークンをPOSTデータとして渡す必要があります。このため、最初にCSRFトークンを取得する必要があります。CSRF保護を有効にしているので、csrftokencookieからトークンを取得します。CSRFトークンCookieの名前は、デフォルトでcsrftokenです。トークンの取得は非常に簡単で、以下のコードスニペットを使用して実行できます。

function getCookie(name) {  
    var cookieValue = null;  
    if (document.cookie && document.cookie != '') {  
        var cookies = document.cookie.split(';');  
        for (var i = 0; i < cookies.length; i++) {  
            var cookie = jQuery.trim(cookies[i]);  

            if (cookie.substring(0, name.length + 1) == (name + '=')) {  
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));  
                break;  
            }  
        }  
    }  
    return cookieValue;  
}  



function csrfSafeMethod(method) {  

    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));  
}  

function sameOrigin(url) {  

    var host = document.location.host; // host + port  
    var protocol = document.location.protocol;  
    var sr_origin = '//' + host;  
    var origin = protocol + sr_origin;  

    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||  
        (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||  

        !(/^(\/\/|http:|https:).*/.test(url));  
}  





$(function() {  

        $("#person_form_id").submit(function(event){  

            event.preventDefault();  
            $.ajax({  
                type:$(this).attr('method'),  

                url:"",  
                data:$(this).serialize(),  
                success: function(){  
                    $('#message').html("<h2 style='color:green;'>Person Form Submitted!</h2>")  
                },  
                error: function(){  
                    $('#message').html("<h2 style='color:red;'>Can't submit form</h2>")  
                }  
            });  
            return false;  
        });  

    });  
    $.ajaxSetup({  
        beforeSend: function(xhr, settings) {  
            if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) {  
                // Send the token to same-origin, relative URLs only.  
                // Send the token only if the method warrants CSRF protection  
                // Using the CSRFToken value acquired earlier  

                xhr.setRequestHeader("X-CSRFToken", csrftoken);  
            }  
        }  
    });  
于 2013-05-21T05:01:02.437 に答える