如何在Django中检查CSRF

时间:2014-08-05 22:19:57

标签: python django

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自动检查还是我们需要做什么?因为我们还可以创建一个没有此令牌的表单,并且该表单可以正常工作。

2 个答案:

答案 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的视图。 您可以了解更多信息:

https://docs.djangoproject.com/en/1.6/ref/contrib/csrf/