Ошибка csrf в django

Я хочу реализовать логин для своего сайта. Я в основном копировал и вставлял следующие биты из книги Django вместе. Однако я все еще получаю сообщение об ошибке (проверка CSRF не удалась. Запрос прерван.) При отправке моей регистрационной формы. Может кто-нибудь сказать мне, что вызвало эту ошибку и как ее исправить?

Вот мой код:

views.py:

# Create your views here.
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/books/")
    else:
        form = UserCreationForm()
    return render_to_response("registration/register.html", {
        'form': form,
    })

register.html:

<html>
<body>

{% block title %}Create an account{% endblock %}

{% block content %}
  <h1>Create an account</h1>

  <form action="" method="post">{% csrf_token %}
      {{ form.as_p }}
      <input type="submit" value="Create the account">
  </form>
{% endblock %}
</body>
</html>

Ответы

Ответ 1

У меня была та же самая проблема - и ответ Blue Peppers заставил меня на правильном пути. Добавление RequestContext в ваше представление формы устраняет проблему.

from django.template import RequestContext

а также:

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
           new_user = form.save()
           return HttpResponseRedirect("/books/")
    else:
        form = UserCreationForm()
    c = {'form': form}
    return render_to_response("registration/register.html", c, context_instance=RequestContext(request))

Это исправило это для меня.

Ответ 2

Я использую Django 1.2.3, у меня было несколько прерывистых проблем:

Чем заняться:

Убедитесь, что в вашем шаблоне присутствует токен csrf:

<form action="" method="post">{% csrf_token %}

Использовать RequestContext:

return render_to_response('search-results.html', {'results' : results}, context_instance=RequestContext(request) )

Убедитесь, что вы также используете RequestContext для GET, если они обрабатываются одной и той же функцией просмотра и отображают один и тот же шаблон.

то есть:

if request.method == 'GET':
    ...
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request) )
elif request.method == 'POST':
    ...
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request))

не

if request.method == 'GET':
    ...
    return render_to_response('search-results.html', {'results':results})
elif request.method == 'POST':
    ...
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request))

Убедитесь, что 'django.middleware.csrf.CsrfViewMiddleware' указан в ваших settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

Ответ 3

Предполагая, что вы на Django 1.2.x, просто добавьте это до {{form.as_p}}:

{% csrf_token %}

И чтобы понять ПОЧЕМУ, просмотрите документы CSRF

Ответ 4

Вам нужно добавить csrf(request) в свой контекст.

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.context_processors import csrf

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/books/")
    else:
        form = UserCreationForm()
    con = {'form': form}
    con.update(csrf(request))
    return render_to_response("registration/register.html", con)

Вам может потребоваться превратить ваш контекст в объект Context для этого, а не dict, но принцип звучит.

Ответ 5

Добавьте эти 2 промежуточных файла в файл настроек, если вы не хотите добавлять {% csrf_token %} в каждую форму.

MIDDLEWARE_CLASSES = (
    #...
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
)

Ответ 6

Позднее ответ.

Теперь render может использовать вместо context_instance=RequestContext(request)

from django.shortcuts import render
return render(request, "registration/register.html", {
        'form': form,
    })

Ответ 7

Попробуйте удалить следующую строку из вашего списка MIDDLEWARE settings.py, если вы собираетесь использовать {% csrf_token%}:

'django.middleware.csrf.CsrfViewMiddleware',

Работал для меня......