Подтвердить что ты не робот

Как защитить csrf_token в движке шаблонов 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 требуется?

При необходимости, как это сделать?

Спасибо заранее!

4b9b3361

Ответ 1

Кажется, Jinja2 работает по-другому:

Используйте <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> где в шаблонах Django вы используете {% csrf_token %}

источник: http://exyr.org/2010/Jinja-in-Django/

Ответ 2

Я знаю, что это старый вопрос, но я хотел обновить его надлежащим образом, чтобы поддерживать csrf_token при использовании нового django.template.backends.jinja2.Jinja2, доступного в Django 1.8+. Используя базовый компонент шаблона django, вы бы назвали {% csrf_token %}, но используя бэкэнд Jinja2, вы вызовете его с помощью {{ csrf_input }} (вы можете получить только значение токена вместо ввода токена, используя {{ csrf_token }}).

Подробности можно найти в django.template.backends.jinja2.Jinja2 источнике

Ответ 3

Я использую 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)

Ответ 4

в django 2.x с движком шаблонов jinja2 вы получаете значение токена с {{csrf_token}} и полный скрытый тег ввода с {{csrf_input}}

источник: https://django.readthedocs.io/en/2.1.x/ref/csrf.html

пример:

<form action="..." method="post">
  {{ csrf_input }}

   ...
</form>

Ответ 6

У меня была та же проблема, и я заметил, что процессор CSRF-контекста не входит в список загруженных по умолчанию процессоров. После добавления 'django.core.context_processors.csrf' в TEMPLATE_CONTEXT_PROCESSORS в setting.py я мог бы обычно использовать тег шаблона {% csrf_token %}.