如何在jinja2模板引擎中保护csrf_token?

时间:2011-10-21 03:07:11

标签: django csrf jinja2

在我使用的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吗?

如果需要,该怎么做?

提前致谢!

6 个答案:

答案 0 :(得分:36)

看来Jinja2的工作方式不同:

使用<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> 您在Django模板中使用{% csrf_token %}

的位置

来源:http://exyr.org/2010/Jinja-in-Django/

答案 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 %}模板代码。