【问题标题】:Django: CSRF is incorrect or missingDjango:CSRF 不正确或丢失
【发布时间】:2017-09-09 09:32:22
【问题描述】:

我看过很多论坛和帖子,但仍然无法掌握它。 Here in django doc,上面写着

在 MIDDLEWARE 设置中默认激活 CSRF 中间件。如果您覆盖该设置,请记住 'django.middleware.csrf.CsrfViewMiddleware' 应该位于任何假定 CSRF 攻击已被处理的视图 > 中间件之前。

如果您禁用它(不建议这样做),您可以在要保护的特定视图上使用 csrf_protect()(见下文)。

在任何使用 POST 表单的模板中,如果表单用于内部 URL,请在 > 元素内使用 csrf_token 标记,例如:

表单动作 {% csrf_token %}

基于此,在我的 html 模板中我做了简单的:

 <form id='frm' name='frm' method="post" action="{% url 'gettip' %}" >
        {% csrf_token %}

 <input type="text" name="tipid" name="tipid">
 <input type="submit" value="Get Tip Value"/>
</form>

我希望 CSRF_token 创建隐藏元素,因为中间件已经加载。我在表单中看不到任何元素,并且收到 CSRF 错误。

表单未与任何模型关联。我也没有使用过forms.py。我目前的观点只是输出一些东西:

def gettip(request):

    if request.POST:
         return HttpResponse('You requested a tip')
   
#from a weblink, i was told to add the following but it made no difference   
context = {}
return render_to_response('tip.html',context, context_instance=RequestContext(request))

我得到的错误显然是缺少 CSRF,因为隐藏元素根本不存在。

我正在从 PHP 迁移,这让我很难过。虽然我的表单不是用于登录目的,但我 couldn't get this one to work either 出现同样的错误。我在 django 1.10 上,只是想在提交表单时得到积极的回应。

【问题讨论】:

  • gettip 是呈现表单所在模板的视图吗?如果不是,请出示那个是的。
  • context_instance 已从 Django 1.10 中的 render_to_response 中删除,因此该视图根本不应该工作。

标签: django


【解决方案1】:

不要使用render_to_response,它已经过时了。请改用render

from django.shortcuts import render

def gettip(request):

   if request.POST:
       return HttpResponse('You requested a tip')

   context = {}
   return render(request, 'tip.html', context)

如果包含表单的模板由另一个视图呈现,您也必须修复该视图。

【讨论】:

  • 谢谢各位。更好地切换回 PHP ......我最终得到了 CSRF 但没有表单元素......有点不一致。希望以后会看看它。
  • 如果您再次尝试 Django,请确保您使用的任何书籍或教程至少是为 Django 1.8 编写的。您链接到的登录表单教程是 2013 年的,所以已经过时了。
  • 关注 django 文档(至少前 4 部分)。最适合学习 django.docs.djangoproject.com/en/1.11/intro/tutorial01.
猜你喜欢
  • 2012-01-09
  • 2013-01-12
  • 2014-07-12
  • 2018-10-23
  • 2011-12-26
  • 2014-03-29
  • 1970-01-01
  • 2021-11-13
  • 2012-04-20
相关资源
最近更新 更多