django/ajax:无法在views.py中获取ajax post数据

django/ajax:无法在views.py中获取ajax post数据,ajax,django,post,Ajax,Django,Post,我从django后端获取ajax post数据时遇到问题,我不知道如何传递值,请帮助 在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 ty

我从django后端获取ajax post数据时遇到问题,我不知道如何传递值,请帮助

在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>
在对应于url
/template\u conf/get\u vulns\u from\u family
的Django方法中,我尝试了以下方法:

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说:
多值dictKeyError:“
中找不到键‘家族’,这意味着PostDictionary是空的。
我是否使用了错误的方式获取post数据?如果是,我该怎么办?谢谢。

您的url
“/template\u conf/get\u vulns\u from\u family”
缺少尾部斜杠。django通常会将其重定向到
“/template\u conf/get\u vulns\u from\u family/”
,删除
POST
data

,如果启用了CSRF,那么简单的ajax POST无法工作。您必须添加csrf令牌并将其设置为ajax请求头

对于Ajax POST请求,您必须在每个POST请求中将CSRF令牌作为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);  
            }  
        }  
    });  
函数getCookie(名称){
var-cookieValue=null;
如果(document.cookie&&document.cookie!=''){
var cookies=document.cookie.split(“;”);
对于(var i=0;i
好吧,我的朋友,你是老板。两个问题:1。在什么情况下我应该处理django中的尾部斜杠?2.我必须为ajax方法添加@csrf\u豁免吗?如果我不添加它,浏览器将给出“403禁止”。太感谢了,你救了我们的培根!如果你来旧金山的话,我会给你一桶啤酒!
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);  
            }  
        }  
    });