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 验证失败的主要内容,如果未能解决你的问题,请参考以下文章