rest framework认证组件和django自带csrf组件区别详解

使用 Django 中的 csrf 处理

Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查。它的原理是在<form>标签中生成一个隐藏的<input>标签,提交表单时将这个隐藏的<input>一块儿提交,服务器端验证这个字段是否正确。html

官方给出的csrf的操做步骤是:django

  1. MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddleware,开启全局csrf保护。
  2. 对于POST至站内的表单,在模板中的<form>标签内添加{% csrf_token %}模板标签。
  3. 在对应的视图函数中确保使用django.template.context_processors.csrfContext处理器。实现方式有两种:
    (1). 使用RequestContext或者直接使用通用视图,它们会自动将csrf_token添加至模板上下文中。
    return render_to_response("xxx.html", context_instance=RequestContext(request))
    (2). 手工导入并使用处理器来生成CSRF token,并将它添加到模板上下文中。例如:
    from django.shortcuts import render_to_response
    from django.template.context_processors import csrf
    def my_view(request):
    c = {}
    c.update(csrf(request))
    # ... view code here
    return render_to_response("a_template.html", c)

可是,手工导入麻烦并且会使代码变得难以维护,使用RequestContext也没好到哪去, 而且在Django 1.8 的文档中说明context_instance 1.8 以后会被废弃。
那咱们应该如何处理csrf_token呢?其实,Django提供了一个快捷函数能够处理这个问题。
django.shortcuts.render在内部设定context_instance缺省是RequestContext的一个实例。调用render即可以自动将csrf_token添加至上下文中。后端


网上有一些博客说能够在settings中设置TEMPLATE_CONTEXT_PROCESSORS实现全局的csrf_token填充至上下文。
可是我实验后发现并很差使,若是有朋友知道缘由的话,还望告知。服务器

我在settings中是这样设置的:框架

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (    
    'django.core.context_processors.csrf',
)


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自此了解到要想django自带的csrf组件生效,要知足以上三个条件
  1. MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddleware,开启全局csrf保护。
  2. 对于POST至站内的表单,在模板中的<form>标签内添加{% csrf_token %}模板标签。
  3. 用render函数渲染视图

而rest framework框架是写先后端分离的项目,返回的结果是用Response返回的,因此django自带的csrf组件不生效,因此使用rest framework的认证组件进行token的认证,这就解释了个人迷惑,为何rest 框架的请求生命周期中是要通过django的中间件的,也是要通过django的csrf组件的,为何咱们本身还要编写认证组件,干吗不用django的。前后端分离

相关文章
相关标签/搜索