【问题标题】:csrf token Follow upcsrf token 跟进
【发布时间】: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)。

标签: python django django-csrf


【解决方案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 要求。
猜你喜欢
  • 2016-04-19
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2015-08-24
  • 2013-11-25
  • 2021-01-26
相关资源
最近更新 更多