Theory
要使csrf保护起作用,需要做一些事情(请查看docs):
- 你的浏览器必须接受服务器中的cookie
- 确保已将
' django.middleware.csrf.CsrfViewMiddleware'
作为中间件包含在中间settings.py(或者在要保护的特定视图上使用装饰器csrf_protect()
) - 确保将csrf令牌从
django.core.context_processors.csrf
传递给上下文管理器。
加载页面时,请使用喜欢的浏览器查看页面源。不要打开模板html文件,打开指向包含表单的视图的URL。看看你放在哪里{% csrf_token %}。如果看到类似
<input type='hidden' name='csrfmiddlewaretoken' value="jdwjwjefjwdjqwølksqøwkop2j3ofje" />
你应该没事的。
另一方面NOTPROVIDED,如果你看到,则在创建csrf令牌时出现了问题。通过查看源代码(
context_processors.py和
csrf.py),我们可以发现:
csrf(request)
回报{'csrf_token': 'NOTPROVIDED'},如果get_token(request)
回报无。get_token(request)
返回request.meta.get("CSRF_cookie", None)。
我认为这意味着None如果未成功创建cookie ,它将返回。
Fix
对你来说,这意味着你应该先更换
<form action="/accounts/auth/" method="post" {% csrf_token %}>与
<form action="/accounts/auth/" method="post">{% csrf_token %}(...)</form>我们希望csrf字段位于内部
<form>...</form>,而不是内部
<form>。由于目前的代码是,它将被转换为
<form action="/accounts/auth/" method="post" <input type='hidden' name='csrfmiddlewaretoken' value='randomchars' />>
我们希望
<form action="/accounts/auth/" method="post"><input type='hidden' name='csrfmiddlewaretoken' value='randomchars' />
之后-查看源代码,看看是否可以找到csrf字段。如果你能看到它,那么一切都应该在理论上起作用。
你还可以检查浏览器(例如Chrome)中是否设置了csrf cookie,右键单击网页,然后选择
Insepect Element。选择
Resources选项卡,然后单击cookie。你应该在
csrftoken那里找到一个cookie名称。
如果仍然有问题,请仔细检查你的中间件元组,
settings.py并如上所述检查浏览器是否接受来自服务器的cookier。



