Python django中的csrf错误
我想实现我的网站登录。我基本上是从Django的书中复制并粘贴了以下内容。但是,在提交注册表时,我仍然收到一个错误(CSRF验证失败。请求被中止)。有人能告诉我是什么引起了这个错误以及如何修复它吗 这是我的密码: views.py:Python django中的csrf错误,python,django,csrf,django-csrf,Python,Django,Csrf,Django Csrf,我想实现我的网站登录。我基本上是从Django的书中复制并粘贴了以下内容。但是,在提交注册表时,我仍然收到一个错误(CSRF验证失败。请求被中止)。有人能告诉我是什么引起了这个错误以及如何修复它吗 这是我的密码: views.py: # Create your views here. from django import forms from django.contrib.auth.forms import UserCreationForm from django.http import Htt
# 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>
{%block title%}创建帐户{%endblock%}
{%block content%}
创建帐户
{%csrf_令牌%}
{{form.as_p}}
{%endblock%}
您需要将csrf(请求)
添加到您的上下文中
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)
为此,您可能需要将您的上下文转换为
上下文
对象,而不是dict
,但原则是正确的。假设您使用的是Django 1.2.x,只需在{form.as\p}
之前添加以下内容:
{%csrf\u令牌%}
如果不想将
{%csrf\u token%}
添加到每个表单中,请查看将这两个中间件添加到设置文件以了解原因
MIDDLEWARE_CLASSES = (
#...
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.csrf.CsrfResponseMiddleware',
)
我遇到了完全相同的问题——蓝辣椒的回答让我走上了正确的轨道。将RequestContext添加到表单视图可以解决此问题
from django.template import RequestContext
以及:
这为我解决了问题。我在使用Django 1.2.3时,出现了一些间歇性问题: 要做的事情: 确保模板中存在csrf令牌:
<form action="" method="post">{% csrf_token %}
return render_to_response('search-results.html', {'results' : results}, context_instance=RequestContext(request) )
如果GET由相同的视图函数处理,请确保您也为GET使用RequestContext,并呈现相同的模板
i、 e:
不是:
确保“django.middleware.csrf.CsrfViewMiddleware”列在您的设置中。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',
)
稍后回答
现在render
可以使用而不是context\u instance=RequestContext(request)
如果要使用{%csrf_token%},请尝试从settings.py的中间件列表中删除以下行:
'django.middleware.csrf.CsrfViewMiddleware',
为我工作……@stevejalim讽刺地说,它仍然可以为1.2工作,但它被弃用了;user433033解决方案是必需的。对于当前的django,更好的解决方案是使用render()而不是render_to_response()。
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))
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',
)
from django.shortcuts import render
return render(request, "registration/register.html", {
'form': form,
})
'django.middleware.csrf.CsrfViewMiddleware',