Skip to main content
 首页 » 编程设计

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

2025年05月04日11shangdawei

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

这只是一个在本地主机上使用 POST 方法的简单 html 表单。不涉及跨站点。我绝对可以通过使用 csrf_token 来修复它,但我仍然不明白为什么 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() 

请您参考如下方法:

如果您执行发布请求,通常会更改服务器的状态。如果您更改服务器的状态,您不想让其他站点这样做。为了防止其他站点在您的服务器上发出后请求,您添加了 csrf 保护。因此,解决方案(恕我直言)绝不应该是删除 Csrf 保护。根据情况,有以下两种情况之一:

  1. 您的发布请求不会更改状态。在这种情况下,将其设为获取请求。
  2. 您的发布请求更改了状态。你需要 CSRF。