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

csrf_token的了解

csrf-token写在head的meta里,面怎么做到防止csrf

CSRF 和 X-CSRF-Token 的区别

vue+flask前后端分离解决csrf token问题

CSRF和token认证

laravel 5 csrf_token 值为空