csrf token 跟进
Posted
技术标签:
【中文标题】csrf token 跟进【英文标题】:csrf token Follow up 【发布时间】:2012-02-19 06:22:49 【问题描述】:您好,提前谢谢您。这是来自以下线程的后续问题(不确定我是否应该在那里发布或开始一个新线程......:
CSRF token missing or incorrect even though I have % csrf_token %
我不确定我需要对代码做什么才能使 csrfContext 正常工作。我正在尝试使用 ModelForm 将数据收集到模型并将其写入 mysql 表。我得到了错误:
失败原因: CSRF 令牌丢失或不正确。
代码如下:
从 django.shortcuts 导入 render_to_response 从 djengo.template 导入 RequestContext 从 django.http 导入 HttpResponse、HttpRequest、HttpResponseRedirect 从 acmetest.models 导入播放器 从 acmetest.models 导入 PickForm csrfContext = RequestContext(请求) return render_to_response('makepick.html', csrfContext) def playerAdd(request, id=None): form = PickForm(request.POST or None, instance=id 和 Player.objects.get(id=id)) # 保存新的/编辑的选择 如果 request.method == 'POST' 和 form.is_valid(): form.save() 返回 HttpResponseRedirect('/draft/') return render_to_response('makepick.html', 'form':form)再次,
感谢您的帮助!
dpbklyn
【问题讨论】:
刚刚看到这个插件问题。不确定答案如何/为什么有帮助,但我必须提到一件事 - 假设您准确剪切/粘贴代码,您将django.template
拼错为 djengo.template
。这不是 invalid 代码,只是拼写错误。 (如果你没有,你应该使用 RequestContext)。
【参考方案1】:
我假设我们正在讨论 playerAdd
视图 - 您需要将 RequestContext
传递给那里的响应。
def playerAdd(request, id=None):
form = PickForm(request.POST or None,
instance=id and Player.objects.get(id=id))
# Save new/edited pick
if request.method == 'POST' and form.is_valid():
form.save()
return HttpResponseRedirect('/draft/')
return render_to_response('makepick.html', RequestContext(request, 'form':form))
代码中的第一行很难理解,甚至看起来都不是有效的 python。您不能在功能块外部使用return
。
【讨论】:
dict
不应该在RequestContext
之外,render_to_response
不应该在render_to_response('makepick.html', 'form':form, RequestContext(request))
之外
@SandipAgarwal 这是一个Context
子类,所以它可以工作。你更喜欢哪个?我认为通过 RC 作为上下文字典更直观
好的。哪种方式更有效?【参考方案2】:
因此更新您的代码:
from django.shortcuts import render
# from djengo.template import RequestContext <- this is not valid.
正如 Yuji 所指出的,这两行不是有效的 python,此外,如果您使用 render
快捷方式,它们也不是必需的。
# csrfContext = RequestContext(request)
# return render_to_response('makepick.html', csrfContext)
修改您的退货线路:
# return render_to_response('makepick.html', 'form':form)
return render(request,'makepick.html','form':form)
【讨论】:
谢谢!我不确定我是否清楚......我虽然出于安全目的需要 csrf。此外,在 HTML 模板上的 如果您将POST
与提交给您的视图的表单一起使用,您总是需要% csrf_token %
(除非您明确地将您的视图标记为exempt from csrf)。 render
快捷方式可满足您的 RequestContext
要求。以上是关于csrf token 跟进的主要内容,如果未能解决你的问题,请参考以下文章