CSRF 令牌丢失或不正确
Posted
技术标签:
【中文标题】CSRF 令牌丢失或不正确【英文标题】:CSRF Token missing or incorrect 【发布时间】:2011-12-26 17:10:50 【问题描述】:这里是 Django 的初学者,我已经尝试解决这个问题很长时间了。 我的中间件类中确实有“django.middleware.csrf.CsrfViewMiddleware”,并且我的帖子表单中确实有令牌。
这是我的代码,我做错了什么?
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from django.template import RequestContext
from django.core.context_processors import csrf
def register(request):
if request.method == 'POST':
c = RequestContext(request.POST, )
form = RegistrationForm(c)
if form.is_valid():
new_user = form.save()
return HttpResponseRedirect("/")
else:
form = RegistrationForm()
return render_to_response("register.html", 'form': form, , )
这是我的模板:
% block content %
<h1>Register</h1>
<form action="" method="POST"> % csrf_token %
form.as_p
<input type="submit" value="Submit">
</form>
% endblock %
【问题讨论】:
Django: CSRF token missing or incorrect 的可能重复项 这篇文章解决了我的问题:***.com/a/20895547/14690597 这篇文章解决了我的问题:***.com/a/20895547/14690597 【参考方案1】:DJANGO/AJAX 工作流程完整方法在这里 :)
const url = "% url 'YOUR_URL_NAME' pk=12345 %".replace(/12345/, id.toString());
$.ajax(
type: 'POST',
url: url,
data: 'id':id, "csrfmiddlewaretoken": 'csrf_token',
beforeSend: function() $('#response').text('Please wait ...'); ,
success: function (response)
console.log(response)
,
error: function (response)
console.log(response)
)
希望能成功!!!
【讨论】:
【参考方案2】:我也遇到了这个问题,但老实说,几分钟后我在浏览器上点击了刷新,没有进行任何更改,并且当时它确实有效。我在命令行中收到了这条消息,因此它可能会为导致问题的原因提供线索:
Not Found: /css/reset/reset.css
[03/Jul/2020 20:52:13] "GET /css/reset/reset.css HTTP/......
【讨论】:
【参考方案3】:对于 Django 3.0 版添加以下注释
@csrf_protect
def yourfunc(request):
return render(request, '../your.html', None)
别忘了在你的字段中添加以下标签
<form action="add/" method="post">
% csrf_token %
...
</form>
【讨论】:
【参考方案4】:更新:这个答案来自 2011 年。CSRF 今天很容易。
这些天你应该使用render
快捷功能return render(request, 'template.html')
,它会自动使用RequestContext
,所以下面的建议已经过时了 8 年。
-
使用
render
https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/
添加CSRF中间件https://docs.djangoproject.com/en/2.2/ref/csrf/
使用% csrf_token %
模板标签
确认您看到 CSRF 令牌值正在生成,并在您的表单请求中提交
原始回复
我的猜测是您在模板中有标签,但它没有呈现任何内容(或者您的意思是您在实际的 HTML 中确认正在生成 CSRF 令牌?)
使用RequestContext
代替字典
render_to_response("foo.html", RequestContext(request, ))
或者确保您的CONTEXT_PROCESSORS
设置中有django.core.context_processors.csrf
。
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
Or add the token to your context manually
【讨论】:
做到了!我仍然很难完全理解它,但至少我已经过去茫然地盯着并试图随机改变事物。文档对我帮助不大,非常感谢! 这是文档中的第 3 步 :) 如果您让自己深入挖掘一下,Django 的文档会非常棒。祝你好运! 非常感谢,这解决了我的问题。给大家的一般建议:检查您是否使用正确的参数使用render_to_response(),我搞砸了并给了它3个参数,因此导致了上述错误。【参考方案5】:对我有用的是从我的settings.py
中注释掉以下行
'django.middleware.csrf.CsrfViewMiddleware'
【讨论】:
这只是完全删除了 CSRF 保护;它没有解决实际问题。【参考方案6】:在我安装 django-livereload-server 后,某些页面上也随机出现此错误。卸载 django-livereload-server 就可以了。
【讨论】:
【参考方案7】:尝试使用 render 而不是 render_to_response:
from django.shortcuts import render
render(request, "foo.html", )
Django - what is the difference between render(), render_to_response() and direct_to_template()?
如上面链接中所述,它是在 Django 1.3 中引入的,并自动使用 RequestContext
【讨论】:
【参考方案8】:@Yuji 'Tomita' Tomita 和@Njogu Mbau 提到,在使用render_to_response
时,添加RequestContext
是关键。然而,当我遇到这个问题时,最初让我失望的是,我必须将 RequestContext
添加到 views.py
中最初加载模板的函数和 views.py
中处理来自模板。
另外,仅供参考,这里有一些讨论相同问题的其他链接
Django - CSRF token missing or incorrect Django 403 CSRF token missing or incorrect Django --CSRF token missing or incorrect Django CSRF Cookie Not Set *【讨论】:
【参考方案9】:如果您没有使用 CsrfViewMiddleware,那么您必须在任何使用 csrf_token 模板标签的视图以及接受 POST 数据的视图上使用 csrf_protect。
【讨论】:
【参考方案10】:只需将此添加到您的视图中
return render_to_response("register.html", 'form': form, , context_instance = RequestContext(request))
它会起作用的!
【讨论】:
以上是关于CSRF 令牌丢失或不正确的主要内容,如果未能解决你的问题,请参考以下文章
CSRF 令牌丢失或不正确。 Django + AngularJS
Django - 403 禁止。 CSRF 令牌丢失或不正确