#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