Django 禁止(CSRF令牌丢失或不正确):
我正在进行ajax调用,如下所示: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
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)
{
}
});