Python 我们是否需要对每个POST请求进行CSRF验证?

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

我正在用POST方法构建一个简单的HTML表单,不幸的是,我发现CSRF验证错误

这只是一个在本地主机上使用POST方法的简单html表单。没有涉及跨站点。我完全可以通过使用
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的一个关键点。恶意网站正在使用访问恶意网站的登录用户的凭据提交帖子。