在我使用的Django模板中:
<form action="/user" method="post">{% csrf_token %}
{{ form.as_p|safe }}
<input type="submit" value="Submit" />
</form>
但是当我更改为jinja2 template engine
时出错:
Encountered unknown tag 'csrf_token'
我的问题:csrf_token protection
中需要jinja2
吗?
如果需要,该怎么做?
提前致谢!
答案 0 :(得分:36)
看来Jinja2的工作方式不同:
使用<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
您在Django模板中使用{% csrf_token %}
答案 1 :(得分:27)
我知道这是一个老问题,但我想在使用Django 1.8+中提供的新csrf_token
时以正确的方式更新它以支持django.template.backends.jinja2.Jinja2
。使用django模板后端你会调用{% csrf_token %}
,但是使用Jinja2后端你将使用{{ csrf_input }}
调用它(你可以使用{{ csrf_token }}
获取令牌值而不是令牌输入)
您可以在django.template.backends.jinja2.Jinja2
source
答案 2 :(得分:0)
我使用Coffin。 使用时遇到同样的问题:
from coffin.shortcuts import render_to_response
return render_to_response('template_name_here.html', context)
尝试使用:
from coffin.shortcuts import render
return render(request, 'template_name_here.html', context)
答案 3 :(得分:0)
在带有jinja2模板引擎的django 2.x中,您可以使用{{csrf_token}}获得令牌的值,并使用{{csrf_input}}获得完整的隐藏输入标签
来源:https://django.readthedocs.io/en/2.1.x/ref/csrf.html
示例:
<form action="..." method="post">
{{ csrf_input }}
...
</form>
答案 4 :(得分:0)
您不再需要执行任何特殊操作。 django-jinja支持csrf_token并且可以直接使用。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>test</title>
</head>
<body>
<p>This should add a hidden input tag with the token. use it in your forms</p>
{% csrf_token %}
</body>
</html>
答案 5 :(得分:-1)
我遇到了同样的问题,我注意到CSRF上下文处理器不在默认加载的处理器列表中。将'django.core.context_processors.csrf'
添加到TEMPLATE_CONTEXT_PROCESSORS
中的setting.py
后,我可以正常使用{% csrf_token %}
模板代码。