csrf 与 ajax 和 django post

2024-02-27

使用jquery v1.7.1和django 1.3,我试图通过ajax发出post请求,在我找到的一些教程代码中web http://lethain.com/intro-to-unintrusive-javascript-with-django/

$(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的问题..

我尝试通过修改ready函数来解决这个问题

$(document).ready(function(){
        $.ajaxSetup({
        data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
    });
        $("#create").click(create_note);

    });

但它不起作用..我仍然明白403 error

所以,我尝试修改数据ajax call

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 文档 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax关于这一点,但我很困惑如何利用它。我应该复制整个jQuery(document).ajaxSend(...代码写入我的javascript文件..我在这里真的很困惑..


你需要 (正如您链接到的文档所建议的那样 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax)复制整个ajaxSend方法 ...

您不需要以任何方式修改它 - 它是一个完整的解决方案 -ajaxSend方法实际上是一个事件处理程序ajaxSend事件。当您使用时会触发.ajaxjQuery 中的方法。请参阅此处的 ajaxSend 文档 http://api.jquery.com/ajaxSend/

上述文档中链接的方法附加了正确的X-CSRFToken您的 AJAX 请求的标头。然后,您可以使用第一种方法发送 AJAX 请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

csrf 与 ajax 和 django post 的相关文章