csrf与ajax和django发布
使用jquery1.7.1和django1.3,我试图通过ajax发布一个post请求,在我在网上找到的一些教程代码中
$(document).ready(function(){ $("#create").click(create_note); }); var create_note = function() { var title = $("#title").val() var slug = $("#slug").val() if (title != "" && slug != "") { var data = { title:title, slug:slug }; console.log('title='+title); console.log('slug='+slug); var args = { type:"POST", url:"/create/", data:data, complete:done }; $.ajax(args); } else { // display failure } return false; };
url“/ create /”映射到django视图
(r'^create/$','notes.views.create_note'), def create_note(request): error_msg = u"No POST data sent." if request.method == "POST": post = request.POST.copy() if post.has_key('slug') and post.has_key('title'): slug = post['slug'] if Note.objects.filter(slug=slug).count() > 0: error_msg = u"Slug already in use." else: title = post['title'] new_note = Note.objects.create(title=title,slug=slug) return HttpResponseRedirect(new_note.get_absolute_url()) else: error_msg = u"Insufficient POST data (need 'slug' and 'title'!)" return HttpResponseServerError(error_msg)
当我单击提交按钮,触发javascript函数create_note
,我收到403错误。 必须是csrf问题..
我试图通过修改就绪function来解决这个问题
$(document).ready(function(){ $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); $("#create").click(create_note); });
但它没有用..我仍然得到403 error
所以,我试图修改ajax
调用中的数据
var create_note = function() { var data = { title:title, slug:slug ,csrfmiddlewaretoken: '{{ csrf_token }}'}; ... var args = { type:"POST", url:"/create/", data:data, complete:done }; $.ajax(args); };
仍然会导致403错误..
请告诉我应该怎么做才能纠正这个..我看到了关于这个的django文档 ,但我很困惑如何利用它。我应该复制整个jQuery(document).ajaxSend(...
代码到我的javascript文件..我真的很困惑..
你需要( 作为你建议链接的文件 )复制整个ajaxSend
方法……
你不需要以任何方式修改它 – 它是一个完整的解决方案 – ajaxSend
方法实际上是ajaxSend
事件的事件处理程序。 当你在jQuery中使用.ajax
方法时会触发它。 请在此处查看ajaxSend文档
上述文档中链接的方法会将正确的X-CSRFToken
标头附加到您的AJAX请求中。 然后,您可以使用第一种方法发送AJAX请求。