2015-03-03 7 views
0

Например, я использую это в views.py:защита CSRF на Джанго FormView

@csrf_protect 
def contacts(request): 
    pass 

Теперь я хочу использовать FormView:

class ContactFormView(FormView): 
    template_name = 'contacts.html' 
    form_class = ContactForm 
    success_url = '/' 

    def form_valid(self, form): 
     # This method is called when valid form data has been POSTed. 
     # It should return an HttpResponse. 
     form.send_email() 
     return super(ContactFormView, self).form_valid(form) 

Так что, когда мне нужно используйте @csrf_protect декоратор?

Спасибо!

+0

Не можете ли вы разместить {% csrf_token%} внутри тегов формы в html? – Yawar

+0

@Yawar i положить в каждую форму – tim

ответ

1

Вы должны использовать method_decorator по методу dispatch:

from django.utils.decorators import method_decorator 

class ContactFormView(FormView): 
    ... 
    @method_decorator(csrf_protect) 
    def dispatch(self, *args, **kwargs): 
     return super(ContactFormView, self).dispatch(*args, **kwargs) 

Однако, настоятельно рекомендуется использовать вместо CsrfViewMiddleware. В противном случае один случай, когда вы случайно забудете декоратора, сразу же наложит на него угрозу безопасности.

+0

Спасибо! И как использовать CsrfViewMiddleware по умолчанию? – tim

+0

Вы должны добавить '' django.middleware.csrf.CsrfViewMiddleware'' в настройку 'MIDDLEWWARE_CLASSES'. Большинство шаблонов проектов, включая собственный шаблон проекта Django, уже включили его. В этом случае вы можете просто пропустить декоратор 'csrf_protect' вообще, ваши представления уже защищены. – knbk