由于CSRF,无法将$ .post数据jQuery到django中的视图

时间:2013-08-07 04:04:08

标签: django post django-csrf csrf-protection

在发布之前,我已经尝试了在线发布的每种解决方案,包括Stackoverflow和Django上的解决方案。 (我认为错误的原因可能是因为我正在使用jQuery和django的新版本,大多数解决方案已经过时了,使用jQuery 1.9和django 1.5.1)

以下是一些不起作用的解决方案的URL:

Django CSRF check failing with an Ajax POST request

How to use $.post with django?

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

任何帮助将不胜感激。错误的另一种可能性是,我实际上并不确定在哪里准确地放置这些片段。到目前为止,我已经在文档加载中粘贴了jquery中的所有内容,我还尝试在.js文件的最开始粘贴代码。 (我的javascript代码在块中碎片化,有些是单独的.js文件,有些是与django上下文呈现的html内联,因此任何带有“{{csrftoken}}”的解决方案都不好。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果CSRF令牌存在于模板中或者视图使用ensure_csrf_cookie()修饰,则只会设置CSRF令牌。将{% csrf_token %}放入index.html会使其适用于您的所有网页。

来自docs

  

CSRF令牌也存在于DOM中,但只有在模板中使用csrf_token明确包含时才会出现。

...

  

如果您的视图没有呈现包含csrf_token模板标记的模板,Django可能不会设置CSRF令牌cookie。这在表单动态添加到页面的情况下很常见。为了解决这种情况,Django提供了一个视图装饰器来强制设置cookie:ensure_csrf_cookie()。

答案 1 :(得分:1)

你可以试试这个:

$.ajax({
            type: "POST",
            url: '{% url "some_url_which_accepts_post" %}',
            data: {'csrfmiddlewaretoken': '{{csrf_token}}', 'comment_id':1},
            success: function(data, textStatus){
                //something
            },  
        });