1

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

这只是一个在 localhost 上使用 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()
4

2 回答 2

8

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

  1. 您的发布请求不会更改状态。在这种情况下,将其设为获取请求。
  2. 您的发布请求会更改状态。你需要 CSRF。
于 2012-08-09T12:52:53.840 回答
0

您收到但未显示的错误消息准确地解释了您做错了什么:您应该确保

视图函数RequestContext 用于模板,而不是Context.

于 2012-08-09T12:49:55.560 回答