dunmaksim
@dunmaksim
Технический писатель

Как в Django v1.8 в ClassBasedView установить CSRF-токен?

Здравствуйте!

Раньше работал, а сейча перестал вот этот код:
from django.shortcuts import render_to_response
from django.template.context_processors import csrf
from django.views.generic import View


class Index(View):

    def get(self, request):
        context = {}
        context.update(csrf(request))
        return render_to_response('index.html', context)


Результатом работы этого кода должна быть HTML-страница, содержащая среди cookies sessionid и csrftoken, по факту же вижу только одну печеньку - sessionid. При этом все MIDDLEWARE и прочие настройки оставлены по-умолчанию. Как исправить данную проблему (?) и заставить Django при рендеринге шаблона задавать cookies для CSRF?
Вот это тоже не работает:
def index(request):
    context = {}
    context.update(csrf(request))
    return render_to_response('index.html', context)
  • Вопрос задан
  • 566 просмотров
Решения вопроса 2
@Nerevar_soul
Для FBV надо в шаблоне добавлять {{ csrftoken }}. CBV если прописана соответствующая MIDDLEWARE в случае FormView добавляет csrftoken автоматически. В случае простого View можно попробовать сделать как в FBV. Или создавать класс на основе FormView или FormMixin.
Ответ написан
dunmaksim
@dunmaksim Автор вопроса
Технический писатель
Решение оказалось на редкость простым: в шаблоне нужно добавить строку:
{% csrf_token %}
В этом и только в этом случае cookie с CSRF-токеном будет присутствовать на странице.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
stackoverflow.com/questions/29829021/django-csrf-v...

class LoginView(FormView):
  success_url = '/blog/edit/'
  form_class = AuthenticationForm
  template_name = 'blog/login.html'
  
  @method_decorator(sensitive_post_parameters('password'))
  @method_decorator(never_cache)<code></code>
  @method_decorator(requires_csrf_token)
  def dispatch(self, request, *args, **kwargs):
    return super(LoginView, self).dispatch(request, *args, **kwargs)


stackoverflow.com/questions/33052063/django-csrf-v...
class UserCreate(View):
  @method_decorator(csrf_exempt)
  def dispatch(self, request, *args, **kwargs):
    return super(UserCreate, self).dispatch(request, *args, **kwargs)

  def post():
  ....
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы