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

您的网址"/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 请求,您必须将 CSRF 令牌作为 POST 数据与每个 POST 请求一起传递。因此,您必须先获取 CSRF 令牌。由于您已启用 CSRF 保护,因此您将从 csrftoken cookie 中获取令牌。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 回答