django/ajax:无法在 views.py 中获取 Ajax 发布数据
Posted
技术标签:
【中文标题】django/ajax:无法在 views.py 中获取 Ajax 发布数据【英文标题】:django/ajax: Unable to get Ajax post data in the views.py 【发布时间】:2012-11-23 18:56:36 【问题描述】:我从 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/template_conf/get_vulns_from_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说:MultiValueDictKeyError: "Key 'family' not found in <QueryDict: >"
,表示POST字典是空的。
我是否使用错误的方式获取帖子数据?如果是这样,我该怎么办?谢谢。
【问题讨论】:
【参考方案1】:您的网址 "/template_conf/get_vulns_from_family"
缺少尾部斜杠。 django 通常会将其重定向到 "/template_conf/get_vulns_from_family/"
,删除 POST
数据
【讨论】:
好吧,我的朋友,你是老板。两个问题:1.在什么情况下我应该在django中处理斜杠? 2.我必须为ajax方法添加@csrf_exempt吗?如果我不添加它,浏览器会给出“403禁止”。非常感谢。 神圣的鳄梨酱你救了我们的培根!如果你来旧金山,你会得到一桶啤酒!【参考方案2】:如果您启用了 CSRF,那么简单的 ajax 发布将不起作用。您必须添加 csrf 令牌并将其设置为 ajax 请求标头。
对于 Ajax POST 请求,您必须将 CSRF 令牌作为 POST 数据与每个 POST 请求一起传递。因此,您必须先获取 CSRF 令牌。由于您已启用 CSRF 保护,因此您将从 csrftoken cookie 中获取令牌。 CSRF 令牌 cookie 默认命名为 csrftoken。获取令牌非常简单,可以使用以下代码 sn-p 来实现。
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);
);
【讨论】:
以上是关于django/ajax:无法在 views.py 中获取 Ajax 发布数据的主要内容,如果未能解决你的问题,请参考以下文章
Django 页面无法呈现 - views.py url 路径中的错误