Ошибка CSRF в Django - PullRequest
       9

Ошибка CSRF в Django

15 голосов
/ 07 июля 2010

Я хочу реализовать логин для моего сайта.Я в основном скопировал и вставил следующие фрагменты из Книги Джанго вместе.Однако я все еще получаю сообщение об ошибке (проверка 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>

Ответы [ 7 ]

19 голосов
/ 27 августа 2010

У меня была точно такая же проблема - и ответ 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))

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

8 голосов
/ 16 января 2011

Я использую 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))

not:

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',
)
6 голосов
/ 07 июля 2010

Если вы используете Django 1.2.x, просто добавьте это перед {{form.as_p}}:

{% csrf_token %}

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

2 голосов
/ 07 июля 2010

Вам необходимо добавить 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, но принцип - звук.

1 голос
/ 01 июля 2015

Позже ответ.

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

from django.shortcuts import render
return render(request, "registration/register.html", {
        'form': form,
    })
1 голос
/ 08 июля 2010

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

MIDDLEWARE_CLASSES = (
    #...
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
)
0 голосов
/ 23 октября 2018

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

'django.middleware.csrf.CsrfViewMiddleware',

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

...