Токен CSRF отсутствует или неверен - PullRequest
18 голосов
/ 11 ноября 2011

Новичок в 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 %}

Ответы [ 7 ]

23 голосов
/ 11 ноября 2011

Обновление: этот ответ с 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/

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

6 голосов
/ 06 ноября 2012

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

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

Это будет работать !!

4 голосов
/ 08 августа 2016

Попробуйте использовать 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

0 голосов
/ 31 мая 2017

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

'django.middleware.csrf.CsrfViewMiddleware'

0 голосов
/ 29 декабря 2016

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

0 голосов
/ 25 февраля 2016

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

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

0 голосов
/ 17 января 2013

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

...