有两种方式来保护CSRF你的Django网站:
1 - 使用中间件,最简单的方法:
django.middleware.csrf.CsrfViewMiddleware
会自动为上下文添加一个CSRF令牌。
此中间件在您的settings.py
文件中默认启用,您可以在模板中直接使用此令牌。
使用此解决方案,您无需执行任何操作,只需在模板中使用{%csrf_token%}标记即可。
2 - 使用csrf_protect
装饰:
如果禁用了中间件(不推荐),你仍然可以使用csrf_protect
装饰(似乎这是你想要的解决方案,而不是与它正如Danielle指出的那样正确导入)。
但是,你的问题似乎是,你不应该像你应该使用它。
这是一个修饰符,即一个函数,它返回作为参数传递的函数的修改版本。在这里你传递一个请求对象。
使用Python,canuse一个装饰这样:
@decorator
def function([...]):
[...]
所以你的观点应该是这样的:使用{% csrf_token %}
标签
@csrf_token
def your_view(request, *args, **kwargs):
# Your view code
:
使用这些解决方案之一后,您可以直接在模板中使用{% csrf_token %}
标签,因为csrf标记应该位于模板呈现的上下文中(感谢middl eware或csrf_protect
装饰):
<form>
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
这里有更多关于CSRF保护和Django:
https://docs.djangoproject.com/en/1.10/ref/csrf/
这里更多的是装饰用的Python:
https://wiki.python.org/moin/PythonDecorators
不幸的是,这给了我相同的错误 –
我认为你不正确地使用装饰 - 检查这里的文档为例:https://docs.djangoproject.com/en/1.10/ref/csrf/#module- django.views.decorators.csrf –