Как защитить csrf_token в движке шаблонов jinja2?

#django #csrf #jinja2

#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 требуется in?

Если требуется, как это сделать?

Заранее спасибо!

Ответ №1:

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

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

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

Комментарии:

1. Это также работает с библиотекой python django-jinja. (Вспомогательная библиотека для быстрого перехода на Jinja2).

2. {{ csrf_input }} является более короткой альтернативой, как объяснено в ответе @Isowen

Ответ №2:

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

Вы можете увидеть подробности в django.template.backends.jinja2.Jinja2 исходном коде

Комментарии:

1. При использовании макросов для рендеринга форм для csrf_input передачи вам нужно будет импортировать их с контекстом, например {% from "bootstrap/forms/horizontal.html" import render_form with context%} . См. Видимость импорта Jinja2 для получения дополнительной информации.

Ответ №3:

в 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>
 

Комментарии:

1. Обновленная ссылка: docs.djangoproject.com/en/3.1/ref/csrf /…

Ответ №4:

Я использую гроб. И у вас такая же проблема при использовании:

 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)
 

Ответ №5:

Вам больше не нужно делать ничего особенного. csrf_token поддерживается в django-jinja и работает из коробки.

 <!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>
 

Комментарии:

1. Когда я использовал его таким образом, я получил ("Encountered unknown tag 'csrf_token'. Jinja was looking for the following tags: 'endblock'. The innermost block that needs to be closed is 'block'.",) ошибку.

2. Это странно. Я использую его.: <метод формы=»post»>{% csrf_token %} {{ form.as_p() }} … У вас есть django_jinja.builtins.extensions. CsrfExtension правильно указан в settings.py , в разделе шаблоны?

Ответ №6:

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

Комментарии:

1. Он говорит jinja2, а не шаблон django