在视图中需要csrf还是在django中使用模板就足够了?

时间:2014-03-18 17:50:24

标签: django django-templates django-views django-csrf

我在教程中见过示例code,如下所示:

    def login_view(request):
        c={}
        c.update(csrf(request))
        return render(request,'login.html',c)

   def login_view(request):
         return render(request,'login.html')

在模板文件中,我声明了csrf_token

{% extends "base.html" %}
{% block content %}
{% if form.errors %}
  <p class="error"> sorry, not a valid username or password </p>
{% endif %}

<form action="/accounts/auth/" method="post">{% csrf_token %}
<label for="username"> UserName:</label>
<input type="text" name="username" value="" id="username">
<label for="password"> Password:</label>
<input type="password" name="password" value="" id="password">
<input type="submit" value="login">
</form>

{% endblock %}

我的问题是两端是否需要csrfrender view以及template)。 render中没有csrf的{​​{1}}工作正常。但我想知道最好的做法。我正在使用view

3 个答案:

答案 0 :(得分:1)

它必须出现在template上以防止cross-site request forgery,但view中不需要{{1}}。 这只是我的意见,我可能是错的。

答案 1 :(得分:1)

你需要删除这一行“c.update(csrf(request))”,因为你在这里有一个重要的安全漏洞,csrf标记应该只从html表单发送,但如果你在csrf中包含csrf查看请求将忽略html表单中的标记(即使它不存在),这就是您的视图在表单中使用和不使用csrf标记的原因。

答案 2 :(得分:0)

您不需要在视图中执行任何特殊操作。只要你有

  

MIDDLEWARE_CLASSES =(...,'django.middleware.csrf.CsrfViewMiddleware',...)

在您的settings.py(这是默认设置)中

,您的模板可以访问{%csrf_token%}标记。无需像示例视图方法那样在模板上下文中手动设置它。