Django有一个CSRF模块来防止跨站点请求伪造。要使用它,我们必须从django导入csrf模块,并传递请求,并将其传递给模板。 像这样。
def login(request):
c = {}
c.update(csrf(request))
return render_to_response("login.html",c)
在模板结束时,我们只需要添加到这样的表单
<form action="/articles/create/" method="post" enctype="multipart/form-data"/>
{% csrf_token %}
<ul>
{{ form.as_ul }}
</ul>
<input type="submit" name="submit" value="Create Article" />
</form>
但是在接收端(/ articles / create /) - 这里,我们不检查令牌。这个CSRF令牌是由django自动检查还是我们需要做什么?因为我们还可以创建一个没有此令牌的表单,并且该表单可以正常工作。
答案 0 :(得分:0)
Django为您处理它,您只需将其传递给模板并使用{% csrf_token %}
将其传递给视图。事实上,您不需要使用渲染快捷方式显式传递令牌,Django将为您传递令牌。
from django.shortcuts import render
def my_view(request):
...
return render(request, 'my_template.html', my_data)
答案 1 :(得分:0)
首先,您需要在设置中启用中间件:
django.middleware.csrf.CsrfViewMiddleware
然后在表单模板中,在开始标记之后,使用:
{% csrf_token %}
在您看来:
如果您正在使用通用视图,那么您将被覆盖,因为通用视图使用RequestContext(后者又使用csrf上下文处理器)。 基于类的视图也不需要这个,在视图中唯一需要处理CSRF的时候是你没有使用上述任何一个:
django.core.context_processors.csrf
from django.shortcuts import render_to_response
def login(request):
c = {}
c.update(csrf(request))
return render_to_response("login.html",c)
此外,如果您使用的是AJAX,则需要实施一些额外的工作,以便将CSRF传输到启用CSRF的视图。 您可以了解更多信息: