【发布时间】: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