Python CSRF令牌丢失或不正确
作为Django的初学者,我已经尝试解决这个问题很久了。 在我的中间件类中有'django.middleware.csrf.CsrfViewMiddleware',在我的post表单中也有令牌 这是我的密码,我做错了什么Python CSRF令牌丢失或不正确,python,django,django-forms,csrf,Python,Django,Django Forms,Csrf,作为Django的初学者,我已经尝试解决这个问题很久了。 在我的中间件类中有'django.middleware.csrf.CsrfViewMiddleware',在我的post表单中也有令牌 这是我的密码,我做错了什么 from django.contrib.auth.forms import UserCreationForm from django.shortcuts import render_to_response from django.http import HttpResponse
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 %}
{%block content%}
登记
{%csrf_令牌%}
{{form.as_p}}
{%endblock%}
Update:这个答案来自2011年。CSRF现在很容易。
现在,您应该使用render
快捷功能return render(request,'template.html')
,它会自动使用RequestContext
,因此下面的建议过期8年
渲染
{%csrf\u令牌%}
模板标记RequestContext
而不是字典
render_to_response("foo.html", RequestContext(request, {}))
或者确保您的context\u处理器设置中有django.core.context\u processors.csrf
只需将此添加到您的视图中即可
return render\u to\u response(“register.html”,{'form':form,},context\u instance=RequestContext(request))
它会起作用的 如果未使用CsrfViewMiddleware,则必须对使用csrf_令牌模板标记的任何视图以及接受POST数据的视图使用csrf_保护。添加RequestContext
是使用呈现到_响应时的关键,正如@Yuji'Tomita'Tomita和@Njogu Mbau所述。然而,当我遇到这个问题时,最初让我感到不快的是,我必须将RequestContext
添加到views.py
中最初加载模板的函数和views.py
中处理模板提交的函数中
此外,仅供参考,这里有一些其他的链接,讨论同样的问题
- *
尝试使用渲染而不是渲染到响应:
from django.shortcuts import render
render(request, "foo.html", {})
正如上面的链接所述,它是在Django 1.3中引入的,并自动使用RequestContext在我安装Django livereload服务器后,在某些页面上随机出现此错误。卸载django livereload服务器就成功了。对我有用的是从我的设置.py中注释掉下面的一行
对于django版本3.0,添加以下注释
@csrf\u保护
def yourfunc(请求):
返回呈现(请求“../your.html”,无)
别忘了在你的字段中添加下面的标签
{%csrf_令牌%}
...
我也遇到了这个问题,但老实说,几分钟后我在浏览器上点击了“刷新”按钮,没有做任何更改,当时它正常工作。我在命令行中显示了此消息,以便提供导致问题的线索:
Not Found: /css/reset/reset.css
[03/Jul/2020 20:52:13] "GET /css/reset/reset.css HTTP/......
成功了!我仍然有点难以完全理解它,但至少我已经不再茫然地盯着它,试图随意改变它。医生没有帮我太多,非常感谢!这是文档中的第3步:)如果你能让自己深入一点,Django的文档会非常棒。祝你好运非常感谢,这解决了我的问题。对每个人的一般建议:检查用户是否使用正确的参数呈现_to_response(),我弄糟了,给了它3个参数,因此导致了上述错误。可能的重复只是完全删除了CSRF保护;它没有解决实际问题。