Недопустимый токен 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 лет.
- Использовать
render
https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/ - Добавьте промежуточное программное обеспечение CSRF https://docs.djangoproject.com/en/2.2/ref/csrf/
- Используйте тег шаблона
{% csrf_token %}
- Подтвердите, что вы видите генерируемое значение токена 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))
Он будет работать!
Ответ 3
Попробуйте использовать render вместо render_to_response:
from django.shortcuts import render
render(request, "foo.html", {})
Django - в чем разница между render(), render_to_response() и direct_to_template()?
Как указано в ссылке выше, она была введена в Django 1.3 и автоматически использует RequestContext
Ответ 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'