rest framework认证组件和django自带csrf组件区别详解
2024-10-19 21:19:52
使用 Django 中的 csrf 处理
Django中有一个django.middleware.csrf.CsrfViewMiddleware
中间件提供了全局的csrf检查。它的原理是在<form>
标签中生成一个隐藏的<input>
标签,提交表单时将这个隐藏的<input>
一起提交,服务器端验证这个字段是否正确。
官方给出的csrf的操作步骤是:
- 在
MIDDLEWARE_CLASSES
中添加django.middleware.csrf.CsrfViewMiddleware
,开启全局csrf保护。 - 对于POST至站内的表单,在模板中的
<form>
标签内添加{% csrf_token %}
模板标签。 - 在对应的视图函数中确保使用
django.template.context_processors.csrf
Context处理器。实现方式有两种:
(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组件生效,要满足以上三个条件
- 在
MIDDLEWARE_CLASSES
中添加django.middleware.csrf.CsrfViewMiddleware
,开启全局csrf保护。 - 对于POST至站内的表单,在模板中的
<form>
标签内添加{% csrf_token %}
模板标签。 - 用render函数渲染视图
而rest framework框架是写前后端分离的项目,返回的结果是用Response返回的,所以django自带的csrf组件不生效,所以使用rest framework的认证组件进行token的认证,这就解释了我的迷惑,为什么rest 框架的请求生命周期中是要经过django的中间件的,也是要经过django的csrf组件的,为什么我们自己还要编写认证组件,干嘛不用django的。
最新文章
- grep查询文本:问一个简单shell问题,将grep的输出赋值给一个变量
- 准备开发一款开源NES模拟器
- codeforces 451E Devu and Flowers
- Moqui之时间转换
- Android Fresco (Facebook开源的图片加载管理库)
- Leetcode | Minimum/Maximum Depth of Binary Tree
- spring.xml命名空间
- 存储过程及Comm.cs类的创建
- C++文件操作之get/getline
- Beaglebone Back学习一(开发板介绍)
- 几个Uboot命令
- [转]getResource()和getResourceAsStream以及路径问题
- Memcached基本架构和思想
- 前端angular使用crypto-js进行加密
- linux文本编辑器vim大全
- 02 jmeter性能测试系列_JForum测试论坛的环境搭建
- 使用Python开发chrome插件
- SSRF漏洞分析与利用
- ios Block详解
- CentOS7 使用ntp设置系统时间,开机自动设置时间,
热门文章
- Java 的编译和运行机制
- typescript整合到vue中的详细介绍,ts+vue一梭子
- Json-lib 进行java与json字符串转换之二
- vs中ffmpeg release版本崩溃问题(转)
- 记录一次从txt文件导入数据的python下的MySQL实现
- if __name__ == ";__main__";: 的使用
- oracle 常用set命令
- str_place()替换函数
- cocos2dx中替代goto的用法:do{}while(0)和CC_BREAK_IF
- winform 打印