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

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

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

  2. 确保 {% csrf_token %}

    <form action="/words/new/" method="post">
    {% csrf_token %}
    {{ form.as_p }}
        <input type="submit" value="Enter" />
    </form>
    
  3. 在我的回复中使用 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 响应以检查它是否返回视图。

标签: django csrf django-csrf csrf-protection


【解决方案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 中检查它时不需要。
猜你喜欢
  • 2012-09-08
  • 2015-06-02
  • 1970-01-01
  • 2017-03-29
  • 2020-03-24
  • 2014-05-23
相关资源
最近更新 更多