Джанго {% csrf_token %} или @csrf_protect

Мне любопытно: я знаю, что в Django есть 2 способа защиты csrf: {% csrf_token %} в шаблонах и @csrf_protect в представлениях.

Так вот вопрос: взаимозаменяемы ли они? Я имею в виду, что я могу использовать, например, только @csrf_protect в своих представлениях без тега {% csrf_token %} в своих шаблонах, и эффект будет таким же?

Я спрашиваю об этом, потому что я использую mako в недавнем проекте Django, и нет такого тега, как {% csrf_token %}...

Спасибо!!!


person Vitalii Ponomar    schedule 13.11.2011    source источник
comment
1. {% csrf_token %} должен быть в шаблонах 2. представление должно быть защищено @csrf_protect или CSRF middleware. Если вы используете другой механизм шаблонов или AJAX, вам необходимо предоставить токен csrf в контексте шаблона. Прочитайте, как: docs.djangoproject.com/en/ dev/ref/contrib/csrf/   -  person user    schedule 21.03.2014


Ответы (1)


Вам нужны оба. {% csrf_token %} добавляет скрытые поля, включенные в POST запросы. В то время как @csrf_protect добавляет переменную контекста, которая используется {% csrf_token %}.

person Some programmer dude    schedule 13.11.2011
comment
Но в документации сказано: 1) В качестве альтернативы вы можете использовать декоратор csrf_protect() для конкретных представлений, которые вы хотите защитить (см. ниже). 2) Вместо того, чтобы добавлять CsrfViewMiddleware в качестве общей защиты, вы можете использовать декоратор csrf_protect, который имеет точно такую ​​​​же функциональность, для определенных представлений, которые нуждаются в защите. Его необходимо использовать как для представлений, которые вставляют токен CSRF в вывод, так и для тех, которые принимают данные формы POST. - person Vitalii Ponomar; 13.11.2011
comment
@VitaliPonomar Вам всегда нужен {% csrf_token %} внутри вашей формы, и представление должно добавить необходимую контекстную переменную. Если переменная контекста добавляется через декоратор, промежуточное ПО или добавляется вручную, не имеет значения, просто она идет как пара. - person Some programmer dude; 13.11.2011