我在教程中见过示例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 %}
我的问题是两端是否需要csrf
(render
view
以及template
)。
render
中没有csrf
的{{1}}工作正常。但我想知道最好的做法。我正在使用view
。
答案 0 :(得分:1)
它必须出现在template
上以防止cross-site request forgery
,但view
中不需要{{1}}。
这只是我的意见,我可能是错的。
答案 1 :(得分:1)
你需要删除这一行“c.update(csrf(request))”,因为你在这里有一个重要的安全漏洞,csrf标记应该只从html表单发送,但如果你在csrf中包含csrf查看请求将忽略html表单中的标记(即使它不存在),这就是您的视图在表单中使用和不使用csrf标记的原因。
答案 2 :(得分:0)
您不需要在视图中执行任何特殊操作。只要你有
在您的settings.py(这是默认设置)中MIDDLEWARE_CLASSES =(...,'django.middleware.csrf.CsrfViewMiddleware',...)
,您的模板可以访问{%csrf_token%}标记。无需像示例视图方法那样在模板上下文中手动设置它。