Django 禁止(CSRF令牌丢失或不正确):

Django 禁止(CSRF令牌丢失或不正确):,django,django-csrf,Django,Django Csrf,我正在进行ajax调用,如下所示: var data_dict = {'user':{{ user.id }}, 'bookId':that.id, 'csrfmiddlewaretoken': '{{ csrf_token }}'}; $.ajax({ type: 'POST', url:"/issuebook", data:data_dict, processData: false, contentTyp

我正在进行ajax调用,如下所示:

var data_dict = {'user':{{ user.id }}, 'bookId':that.id, 'csrfmiddlewaretoken': '{{ csrf_token }}'};
    $.ajax({
        type: 'POST',
        url:"/issuebook",
        data:data_dict,
        processData: false,
        contentType: false,
        success:function(response)
        {
        }
    });
url.py是:

urlpatterns = [
url(r'^$',views.checkLogin,name='checklogin'),
url(r'^mylibrary/(?P<pk>\d+)/(?P<user_name>[\w\-]+)$',login_required(views.MyLibrary.as_view()),name='mylibrary'),
url(r'^centrallibrary/(?P<pk>\d+)/(?P<user_name>[\w\-]+)$',login_required(views.CentralLibrary.as_view()),name='centrallibrary'),
url(r'^issuebook$',login_required(views.IssueBookView.as_view()),name='issuebook'), 

此错误是由ajax函数中的
processData
contentType
选项引起的。删除这两个选项将解决此问题

说明:
参数必须以URL编码的形式发送给Django,内容类型为
application/x-www-form-urlencoded
。然而,如果您设置
processData:false
它将不会对POST参数进行编码,
contentType:false
将发送ajax POST请求作为
text/plain

您刚刚将字符串
'{csrf_token}}
作为
csrfmiddlewaretoken
传递,并且您的ajax调用无法与相关的字符串匹配。相反,您可以从调用函数中的html手动获取
csrf
token的哈希值。也可以在问题中添加呈现的html模板。@v1k45我已经在编辑的问题中添加了呈现的{csrf\u token}}。除此之外,我只是在工作的模板中呈现一些字符串值fine@v1k45此外,我没有在模板中使用任何表单。此ajax调用在按钮单击事件时完成尝试在ajax请求中将
X-CSRFToken
请求头设置为
CSRFToken
。如果将其设置为此会怎么样?内容类型:application/json;字符集=UTF-8。这样行吗?我得到与上面相同的错误。@Axwack不,它不起作用。Django不理解
application/json
POST请求。尝试以
内容类型:application/x-www-form-urlencoded
的形式发送数据。如果您无法控制请求,还有另一种方法可以接受
json
请求。如果你想知道,我会再发一条评论。
var data_dict = {'user':{{ user.id }}, 'bookId':that.id, 'csrfmiddlewaretoken':'fSSdu8dJ4FO6FvDz8eU5ISzOewRYyGbC'};
                    $.ajax({
                        type: 'POST',
                        url:"/issuebook",
                        data:data_dict,
                        contentType: false,
                        success:function(response)
                        {
                        }
                    });