Требуются ли формы, использующие метод POST, для защиты CSRF? Я слежу за книгой, а примеры кода выдают 403 ошибки. Я провел некоторый поиск, и мне кажется, что мне нужно включить CSRF во всех моих формах.
Мои вопросы:
Требует ли теперь Django, чтобы все формы POST были защищены от CSRF?
Все, что мне нужно сделать для этого добавьте 'django.middleware.csrf.CsrfViewMiddleware', верните render_to_response (template, словарь context_instance = RequestContext (запрос) и добавить '{% csrf_token%}' в соответствующую форму? Я что-то здесь упускаю?
Когда я это делаю, форма отлично работает. Когда какая-либо из этих частей отсутствует, она не достигает 403. Я просто хочу убедиться, что я делаю это правильно. :)
Заранее спасибо.
edit:
По какой-то причине этот код не имеет смысла для меня, но он не возвращает никакой ошибки. Пожалуйста, игнорируйте примитивную проверку, так как я еще не попал в раздел книги, где он покажет более эффективный способ сделать это.
def contact(request):
errors = []
if request.method == 'POST':
if not request.POST.get('subject',''):
errors.append('Enter a subject')
if not request.POST.get('message',''):
errors.append('Enter a message')
if request.POST.get('email', '') and '@' not in request.POST['email']:
errors.append('Enter a valid email address')
if not errors:
send_mail(
request.POST['subject'],
request.POST['message'],
request.POST.get('email', 'noreply@example.com'), ['siteownder@example.com'],)
return HttpResponseRedirect('/contact/thanks/')
return render_to_response('contact_form.html', { 'errors': errors }, context_instance=RequestContext(request))
Моя проблема связана с самой последней строкой этой функции представления. Он вызывается только если request.method! = POST. Это кажется мне совершенно неправильным. Разве я не должен вызывать "context_instance = RequestContext (request)", когда это выполняет POST?