Django 1.2.4 CSRF验证失败

Bry*_*yan 8 django csrf django-csrf csrf-protection

当我执行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>
    
    Run Code Online (Sandbox Code Playgroud)
  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,
        })
    
    Run Code Online (Sandbox Code Playgroud)

请注意,GET操作适用于此功能.所以我认为我正在使用render_to_response.

我甚至试图投入@csrf_protect装饰器,甚至那似乎没有用.我没有想法,我准备用笔记本电脑掐自己.

你们能想到的任何事情?

谢谢!

And*_*Dog 7

你没有关注#3.在RequestContext必须与展示形式模板的呈现使用.感谢页面没有必要.

return render_to_response('dict/create_definition.html', {
    'form' : form,
}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

作为旁注,您应该使用PRG模式而不是直接呈现感谢页面.

  • @bryli:确实是这个问题.CSRF上下文处理器在创建令牌并将其放入模板上下文时需要请求上下文,(可能)在POST中检查时不需要. (3认同)