Ошибка 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',
Работал для меня......