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自动检查的,还是我们需要做些什么?因为我们也可以在没有这个令牌的情况下创建表单,这样就可以正常工作了。
发布于 2014-08-06 06:31:12
Django为您处理它,您只需将其传递给模板,并使用{% csrf_token %}
将其传递给视图。事实上,你不需要显式地传递令牌,使用render快捷方式,Django会为你传递令牌。
from django.shortcuts import render
def my_view(request):
...
return render(request, 'my_template.html', my_data)
发布于 2014-08-06 06:32:10
首先,您需要在您的设置中启用中间件:
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的视图。您可以了解更多信息:
https://stackoverflow.com/questions/25149287
复制相似问题