Django Rest Framework

文章目录

  • serializers序列化
    • modelSerializer
    • ViewSetMixin
    • router模块
    • 所有以上功能rest framework都有已经封装好的包
  • restframwork提供的其他组件
    • 版本组件
    • 认证组件
    • 权限组件
    • 频率限制
    • 分页器
    • 解析器
    • 渲染器

serializers序列化

DRF
Django Rest Framework
rest 剩下,多余的意思
framework 框架
django的多余的框架,就是django的另外一个框架,可能是作者写完django框架后闲着也是闲着,就在原框架的基础上新增了一些功能,改动的太多,就另外写了一个建立在原框架上的包,功能更加完善,涉及的范围更广。
使用restframework
首先下载djangorestframework包
pip install djangorestframework
如果使用restframework提供的页面,需注册进setting中的app
Django Rest Framework_第1张图片
在Django中使用序列化具体工具步骤如下:
Django Rest Framework_第2张图片
页面效果
Django Rest Framework_第3张图片

modelSerializer

Django Rest Framework_第4张图片

ViewSetMixin

带Minxin后缀都是和别的类一起继承才能生效,不能单独继承,因为里面的方法要建立在别的类传的参数的基础上才能执行
Django Rest Framework_第5张图片
原理
Django Rest Framework_第6张图片

router模块

Django Rest Framework_第7张图片

所有以上功能rest framework都有已经封装好的包

分别在以下几个模块中,
Django Rest Framework_第8张图片

restframwork提供的其他组件

版本组件

为什么要有版本控制组件呢?比如python2和python3,有些第三方包已经不更新了,只支持python2版本,为什么不更新,因为他懒呗,或者退休了?所以只能用python2来使用我的这个包。
而rest_framework中的版本控制可以实现后端根据不同版本号返回不同的信息等功能。
首先看看打印request.version封装的是什么
Django Rest Framework_第9张图片
源码分析
Django Rest Framework_第10张图片
如果versioning_class不为None,就会继续往下走,可以在setting.py中自定义版本类,
Django Rest Framework_第11张图片
由此可见,request.version的值是什么完全取决于determine_version方法的返回值是什么,一般想要拿到的是版本号,可以在url中传版本号,该方法接收,然后在视图函数中判断版本号

Django Rest Framework_第12张图片
rest_framework已经写好了类似的类,拿过来用就可以了
Django Rest Framework_第13张图片
BaseVersioning中的配置项

Django Rest Framework_第14张图片

使用URLPathVersioning类示例
Django Rest Framework_第15张图片

认证组件

  • 背景知识
    每个网站都需要用户认证,Django中提供的认证方式是在浏览器中存cookie,后端数据库中存session,用户登录后给一个随机字符串给浏览器,下次登录时和数据库中的session值比对

也可以用户的密码一般都是经过加密后传给后端,方式是md5,或mid5动态加盐等,但都可以破解
也可以自己设置加密算法,如编写属于本公司的密码本
以上几种方式都是需要和数据库中的值进行比对,io操作比较慢,
现在比较流行的是直接把用户名和密码加密后返回给浏览器,不存在数据库,计算操作可以节省时间,速度变快。更加容易实现单点操作(如登录百度账号后,百度云等各项应用不用重复登录)

  • 使用restframework中提供的认证方法
    • 准备工作
      在项目中新建一个app,
      startapp authdemo
      注册app
      Django Rest Framework_第16张图片
      新建用户表
      Django Rest Framework_第17张图片

Django Rest Framework_第18张图片

  • 请求来时携带token值和数据库中的token值比对,可以放在请求头,可以放在url中,如放在url中
    request.user—>返回authenticate方法返回的第一个值
    request.auth---->返回authenticate方法返回的第二个值
    Django Rest Framework_第19张图片
    认证步骤
    Django Rest Framework_第20张图片
    如果全局设置中配置认证类,会作用于项目下的所有url
    Django Rest Framework_第21张图片
    解决方法是把setting中刚刚配置的全局的类删除,配置在视图函数中
    Django Rest Framework_第22张图片

权限组件

登录成功才有权限做不同的操作,匿名登录是没有权限的。
Django Rest Framework_第23张图片

频率限制

为了防止恶意访问和爬虫
一般以ip地址做限流,限流后这段时间不能访问了。
步骤
1 获取访问者的ip地址
2 访问列表的字典:ip为key,时间为值
3 判断ip是否在访问列表里
4 不在:第一次访问,给访问列表加入ip:[now]
5 在: 把now放入IP:[now, time2, time3]
6 确保列表里最近的访问时间和最远的访问时间差在限制的时间范围内,
7 判断列表长度是否在限制次数内

  • 新建app
    在这里插入图片描述
    Django Rest Framework_第24张图片
    Django Rest Framework_第25张图片

分页器

新建app
Django Rest Framework_第26张图片
继承框架的PageNumberPagination类
Django Rest Framework_第27张图片
继承框架LimitOffsetPagination类
Django Rest Framework_第28张图片
继承CursorPagination

Django Rest Framework_第29张图片
上例cursor可记录每页id的最大值及最小值
对比以上,PageNumberPagination是有页码数和从哪页开始的
Django Rest Framework_第30张图片

解析器

Django解析器
form表单(urlencoded), 文件类型,request.body拿json数据
DRF解析器
Django Rest Framework_第31张图片
原理:
拿到我们配置的所有解析器类的实例化对象
通过ContentType跟解析器的media_type进行匹配
匹配成功吧解析器类的实例化对象返回
调用解析器类的parse方法去解析数据
把解析好的数据返回

渲染器

Django Rest Framework_第32张图片
为什么没有写html页面也会有网站,因为框架用渲染器渲染出来的,如分页器,书籍表等,

你可能感兴趣的:(Django)