Django 1.2.4 CSRF 验证失败

Posted

技术标签:

【中文标题】Django 1.2.4 CSRF 验证失败【英文标题】:Django 1.2.4 CSRF verification failed 【发布时间】:2011-06-14 02:04:41 【问题描述】:

当我执行 POST 表单时,Django 1.2 一直给我这个 CSRF 验证错误。我“认为”我已经完成了 Django 1.2 文档中要求的所有事情,即,

    确保 MIDDLEWARE_CLASSES 包含在“django.middleware.csrf.CsrfViewMiddleware”中

    确保 % csrf_token %

    <form action="/words/new/" method="post">
    % csrf_token %
     form.as_p 
        <input type="submit" value="Enter" />
    </form>
    

    在我的回复中使用 RequestContext

    def create(request):
        if request.method == 'POST':
            form = DefinitionForm(request.POST)
            if form.is_valid():
                form.save()
            c = 
            return render_to_response('dict/thanks.html',c, 
                                        context_instance=RequestContext(request))
        else:
            form = DefinitionForm()
        return render_to_response('dict/create_definition.html', 
            'form' : form,
        )
    

请注意,GET 操作在此函数中有效。所以我认为我正在使用 render_to_response 正确。

我什至尝试过添加 @csrf_protect 装饰器,但似乎也没有用。我没有想法,我的笔记本电脑快要窒息了。

你们能想到什么吗?

谢谢!

【问题讨论】:

检查浏览器中的 HTML 以确保 csrf 令牌字段在其中。然后转储 POST 响应以检查它是否返回视图。 【参考方案1】:

你没有关注#3。 RequestContext 必须与显示表单的模板的呈现一起使用。感谢页面不需要。

return render_to_response('dict/create_definition.html', 
    'form' : form,
, context_instance=RequestContext(request))

附带说明,您应该使用PRG pattern 而不是直接呈现感谢页面。

【讨论】:

那是 GET 动作。如果您再次查看代码,我已经将其包含在 request.method == 'POST' 时的条件中。 @bryli:这正是问题所在。 CSRF 上下文处理器在创建令牌并将其放入模板上下文时需要请求上下文,(可能)在 POST 中检查它时不需要。

以上是关于Django 1.2.4 CSRF 验证失败的主要内容,如果未能解决你的问题,请参考以下文章

django CSRF 验证失败。请求中止

CSRF 验证失败。请求中止。在 django 上

iPhone POST 到 Django 并获得 CSRF 验证失败

管理面板的 Django CSRF 验证失败

注销时 Django CSRF 验证失败

Django-ajax:CSRF 验证失败。请求中止