Python 我们是否需要对每个POST请求进行CSRF验证?
我正在用POST方法构建一个简单的HTML表单,不幸的是,我发现CSRF验证错误 这只是一个在本地主机上使用POST方法的简单html表单。没有涉及跨站点。我完全可以通过使用Python 我们是否需要对每个POST请求进行CSRF验证?,python,django,post,django-forms,Python,Django,Post,Django Forms,我正在用POST方法构建一个简单的HTML表单,不幸的是,我发现CSRF验证错误 这只是一个在本地主机上使用POST方法的简单html表单。没有涉及跨站点。我完全可以通过使用csrf\u令牌来修复它,但我仍然不明白django为什么要我这么做 此处不涉及重新指示/iFrame 那么,为什么会发生这种情况??这对所有人来说都正常吗 # Also tried using RequestContext(request) but there isn't any change in the error
csrf\u令牌来修复它,但我仍然不明白django为什么要我这么做
此处不涉及重新指示/iFrame
那么,为什么会发生这种情况??这对所有人来说都正常吗
# Also tried using RequestContext(request) but there isn't any change in the error
#settings.py
'django.middleware.csrf.CsrfViewMiddleware' in MIDDLEWARE_CLASSES
#views.py
# url for home page is "" i.e, http://127.0.0.1:8000/
def HomePage (request):
if request.method == "POST":
form = myForm(request.POST)
if form.is_valid():
data = form.cleaned_data
context = { "myForm" : myForm(choices),
"values" : data,
}
return render_to_response("home.html", context)
else:
form = myForm(choices)
context = {"myForm" : form}
return render_to_response("home.html", context)
# home.html
<div id="pingmeeForm">
<form action="" method="post">
<table>
{{myForm.as_table}}
</table>
<input name="enter" type="submit" value="enter"/>
</form>
{{values}}
</div>
# forms.py
class myForm (forms.Form):
def __init__(self, my_choices,*args, **kwargs):
super(myForm, self).__init__(*args, **kwargs)
self.fields['Friends'] = forms.ChoiceField(choices=my_choices)
message = forms.CharField()
#也尝试使用RequestContext(request),但错误没有任何变化
#设置.py
中间件类中的“django.middleware.csrf.CsrfViewMiddleware”
#views.py
#主页的url为“”,即,http://127.0.0.1:8000/
def主页(请求):
如果request.method==“POST”:
form=myForm(request.POST)
如果form.is_有效():
data=表格.U数据
上下文={“myForm”:myForm(选项),
“价值”:数据,
}
返回render\u to\u响应(“home.html”,上下文)
其他:
form=myForm(选项)
上下文={“myForm”:form}
返回render\u to\u响应(“home.html”,上下文)
#home.html
{{myForm.as_table}}
{{values}}
#forms.py
类myForm(forms.Form):
定义初始化(self,my_选项,*args,**kwargs):
super(myForm,self)。\uuuuuu初始化(*args,**kwargs)
self.fields['Friends']=forms.ChoiceField(choices=my_choices)
message=forms.CharField()
您收到但未显示的错误消息准确地解释了您的错误:您应该确保
查看功能使用RequestContext
对于模板,而不是上下文
您收到但未显示的错误消息准确地解释了您做错了什么:您应该确保
查看功能使用RequestContext
对于模板,而不是上下文
如果执行post请求,通常会更改服务器的状态。如果更改服务器的状态,则不希望允许其他站点这样做。为了防止其他站点在您的服务器上发出post请求,您添加了csrf保护。因此,解决方案(imho)决不能是移除Csrf保护。视情况而定,以下两种情况之一:
您的post请求不会更改状态。在这种情况下,将其设置为get请求
您的post请求会更改状态。你需要CSRF
如果执行post请求,通常会更改服务器的状态。如果更改服务器的状态,则不希望允许其他站点这样做。为了防止其他站点在您的服务器上发出post请求,您添加了csrf保护。因此,解决方案(imho)决不能是移除Csrf保护。视情况而定,以下两种情况之一:
您的post请求不会更改状态。在这种情况下,将其设置为get请求
您的post请求会更改状态。你需要CSRF
如果在settings.py
中的中间件中有django.middleware.csrf.CsrfViewMiddleware
,则会针对每个POST
请求检查它。若你们真的不想要CSRF功能,你们可以删除它,但这并不推荐。或者,在模板中使用{%csrf\u token%}
或查看csrf\u excempt
。如果django.middleware.csrf.CsrfViewMiddleware
在settings.py
的中间件中有django.middleware.csrf.CsrfViewMiddleware
,则会针对每个POST
请求对其进行检查。若你们真的不想要CSRF功能,你们可以删除它,但这并不推荐。或者,在模板中使用{%csrf\u token%}
或csrf\u excempt
查看。我添加了context\u instance=RequestContext(request)
,但msgI添加的错误中没有任何更改context\u instance=RequestContext(request)
但错误MSG没有任何变化这是一个很好的答案,但在我看来忽略了CSRF的一个关键点。恶意网站使用访问恶意网站的登录用户的凭据提交帖子。这是一个很好的答案,但我认为没有抓住CSRF的一个关键点。恶意网站正在使用访问恶意网站的登录用户的凭据提交帖子。