通过$ .ajax()数据传递csrf令牌无法正常工作

时间:2017-01-11 00:00:06

标签: jquery ajax django

所以我试图在我的django应用程序中进行ajax评论,并且我遇到了:

Forbidden (CSRF token missing or incorrect.): /app/437/

错误。通过阅读许多SO答案后,似乎最常用和简单的方法来处理此错误是通过$ .ajax()数据传递csrf令牌,如下所示:

$('.comment_form').on('submit', function(e) {
e.preventDefault();

var url = window.location.href.split('?')[0];
    console.log(url)

$.ajax({
    type: 'POST',
    url: url,
    data: {
        text: $('.comment_text').val(),
        'csrfmiddlewaretoken': '{{csrf_token}}',
        },
    success: function() {
        $('.comment_div').append("<div class='comment_div'><h3>username</h3><p>" + text + "</p></div>");
        console.log(text);
    }
})
});

如果你有点好奇,请点击这里的模板:

{% block comments %}
{% load widget_tweaks %}

<div class="commentsContainer">

    <form action="" class="comment_form">{{csrf_token}}
        {{ comment.comment_text|add_class:"comment_text" }} <!-- this is a textarea-->
        <input type="submit" value="Comment" class="comment_submit">
    </form>
    <div class="comment_div">
        <h3>username1</h3>
        <p>Some text</p>
    </div>
</div>

{% endblock %}

以下是我的观点:

def article(request, category, id):

    name = resolve(request.path).kwargs['category']
    for a, b in CATEGORY_CHOICES:
        if b == name:
            name = a
            instance = get_object_or_404(Post, id=id, category=name)

    allauth_login = LoginForm(request.POST or None)
    allauth_signup = SignupForm(request.POST or None)
    comment = CommentForm(request.POST or None)

    context = {
        'comment': comment,
        'instance': instance,
        'allauth_login': allauth_login,
        'allauth_signup': allauth_signup
    }


    return render(request, 'article.html', context)

2 个答案:

答案 0 :(得分:1)

您必须在{% csrf_token %}内使用<form>;它将呈现一个隐藏的输入,它具有名称和值。然后,在ajax的数据中,您应该发送该输入的,如下所示:

...
data: {
    text: $('.comment_text').val(),
    csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
},
...

答案 1 :(得分:0)

我相信你的标题需要看起来像这样:

q?˜?œ‹–74˜“›Ÿ?JsnJJJJ

另外,在您的表单中,您应该使用headers: { 'X-CSRFToken': "{{ csrf_token }}" } 而不是{% csrf_token %}

查看文档了解相关信息。 https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax