Недопустимый токен CSRF

Начинающий в Django здесь, я пытался исправить это уже давно. У меня есть "django.middleware.csrf.CsrfViewMiddleware" в моих классах промежуточного программного обеспечения, и у меня есть токен в моей форме сообщения.

Вот мой код, что я делаю неправильно?

from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from django.template import RequestContext
from django.core.context_processors import csrf

def register(request):

    if request.method == 'POST':
        c = RequestContext(request.POST, {})
        form = RegistrationForm(c)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/")
    else:
        form = RegistrationForm()

    return render_to_response("register.html",  {'form': form,  }, )

Здесь мой шаблон:

{% block content %}

    <h1>Register</h1>
    <form action="" method="POST"> {% csrf_token %}
        {{ form.as_p }}
    <input type="submit" value="Submit">
    </form>

{% endblock %}

Ответы

Ответ 1

Обновление: этот ответ с 2011 года. CSRF сегодня легок.

В эти дни вы должны быть с помощью render ярлыка функции return render(request, 'template.html'), который использует RequestContext автоматически, поэтому ниже советы устареть 8 лет.

  1. Использовать render https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/
  2. Добавьте промежуточное программное обеспечение CSRF https://docs.djangoproject.com/en/2.2/ref/csrf/
  3. Используйте тег шаблона {% csrf_token %}
  4. Подтвердите, что вы видите генерируемое значение токена CSRF И отправленное в запросе формы

Оригинальный ответ

Я предполагаю, что у вас есть тег в шаблоне, но он ничего не отображает (или вы имели в виду, что подтвердили в фактическом HTML, что создается токен CSRF?)

Либо используйте RequestContext вместо словаря

render_to_response("foo.html", RequestContext(request, {}))

Или убедитесь, что у вас есть django.core.context_processors.csrf в настройке CONTEXT_PROCESSORS.

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

Или добавьте токен в свой контекст вручную

Ответ 2

Просто добавьте это в свои представления

return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))

Он будет работать!

Ответ 4

Если вы не используете CsrfViewMiddleware, вы должны использовать csrf_protect для любых представлений, использующих тег шаблона csrf_token, а также те, которые принимают данные POST.

Ответ 5

Добавление RequestContext является ключевым при использовании render_to_response, как упомянуто @Yuji 'Tomita' Tomita и @Njogu Mbau. Однако то, что изначально меня отбросило, когда я боролся с этой проблемой, заключалось в том, что мне пришлось добавить RequestContext к функции в views.py, которая первоначально загружает шаблон и в функцию в views.py, которая обрабатывает представление из шаблон.

Кроме того, для справки, вот некоторые другие ссылки, которые обсуждают эту же проблему

Ответ 6

Также случайно получена эта ошибка на некоторых страницах после установки django-livereload-сервера. Деинсталляция django-livereload-server сделала трюк.

Ответ 7

Что сработало для меня, было комментировать нижнюю строку из моего settings.py

'django.middleware.csrf.CsrfViewMiddleware'