Django 1.2.4 Проверка CSRF не удалась

Django 1.2 постоянно выдает мне эту ошибку проверки CSRF, когда я выполняю форму POST. Я «думаю», что сделал все, что было задано в документах Django 1.2, а именно:

  1. Убедитесь, что MIDDLEWARE_CLASSES включен в «django.middleware.csrf.CsrfViewMiddleware».

  2. Убедитесь, что {% csrf_token %}

    <form action="/words/new/" method="post">
    {% csrf_token %}
    {{ form.as_p }}
        <input type="submit" value="Enter" />
    </form>
    
  3. Используйте RequestContext в моем ответе

    def create(request):
        if request.method == 'POST':
            form = DefinitionForm(request.POST)
            if form.is_valid():
                form.save()
            c = {}
            return render_to_response('dict/thanks.html',c, 
                                        context_instance=RequestContext(request))
        else:
            form = DefinitionForm()
        return render_to_response('dict/create_definition.html', {
            'form' : form,
        })
    

Обратите внимание, что в этой функции работает действие GET. Так что я думаю, что правильно использую render_to_response.

Я даже пытался добавить декоратор @csrf_protect, но даже это не сработало. У меня закончились идеи, и я собираюсь задушить себя своим ноутбуком.

Что-нибудь, что вы, ребята, можете придумать?

Спасибо!


person Bryan    schedule 23.01.2011    source источник
comment
Проверьте HTML-код в своем браузере, чтобы убедиться, что там есть поле токена csrf. Затем выгрузите ответы POST, чтобы убедиться, что они возвращаются к представлению.   -  person Spacedman    schedule 23.01.2011


Ответы (1)


Вы не следуете пункту 3. RequestContext необходимо использовать с рендерингом шаблона, который показывает форму. Для страницы благодарности это не обязательно.

return render_to_response('dict/create_definition.html', {
    'form' : form,
}, context_instance=RequestContext(request))

И в качестве примечания: вам следует использовать шаблон PRG вместо вывода благодарностей страницу напрямую.

person AndiDog    schedule 23.01.2011
comment
Это для действия GET. Если вы еще раз посмотрите на код, я включил его для условия, когда request.method == 'POST'. - person Bryan; 23.01.2011
comment
@bryli: Именно в этом проблема. Процессору контекста CSRF нужен контекст запроса при создании токена и помещении его в контекст шаблона (вероятно), а не при проверке его в POST. - person AndiDog; 23.01.2011