开发项目是有多个版本的

随着项目的更新,版本就越来越多.不可能新的版本出了,以前旧的版本就不进行维护了

那我们就需要对版本进行控制,这个DRF框架也给我们提供了一些封装好的版本控制方法

版本控制组件

流程

ViewClass.as_view –> APIView.as_view –> View.as_view –> return self.dispatch –> 找 API.dispatch() –> initial(): version, scheme = self.determine_version(request, *args, **kwargs)

APIView返回View中的view函数,然后调用的dispatch方法,那我们现在看下dispatch方法,看下它都做了什么

执行self.initial方法之前是各种赋值,包括request的重新封装赋值,下面是路由的分发,那我们看下这个方法都做了什么

我们可以看到,我们的version版本信息赋值给了 request.version  版本控制方案赋值给了 request.versioning_scheme~~

其实这个版本控制方案~就是我们配置的版本控制的类

也就是说,APIView通过这个方法初始化自己提供的组件

我们接下来看看框架提供了哪些版本的控制方法~~在rest_framework.versioning里~~

使用方法

REST_FRAMEWORK 的设置都在一个字典里面 rest_framework 视图APIView的as_view 方法对View中的request 进行了封装

版本控制代码的实现

版本配置 DRFDemo/settings.py

REST_FRAMEWORK = {# 默认使用的版本控制类'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',# 允许的版本'ALLOWED_VERSIONS': ['v1', 'v2'],# 版本使用的参数名称'VERSION_PARAM': 'version',# 默认使用的版本'DEFAULT_VERSION': 'v1',
}

第一步 setting.py

REST_FRAMEWORK = {# "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion", # 自定义的版本控制类"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning","DEFAULT_VERSION": "v1","ALLOWED_VERSIONS": "v1, v2","VERSION_PARAM": "ver"   # ver=v1
}

自定义版本控制类 utils/version.py

from rest_framework import versioningclass MyVersion(object):def determine_version(self, request, *args, **kwargs):# 返回值 给了request.version# 返回版本号# 版本号携带在过滤条件 xxxx?version=v1version = request.query_params.get("version", "v1")return version

urlpatterns = [path(r"v1/", DemoView.as_view()),
]

第二步 urls.py

视图 versionDemo/views.py

from rest_framework.views import APIView
from rest_framework.response import Responseclass DemoView(APIView):def get(self, request):print(request.version)print(request.versioning_scheme)# 得到版本号  根据版本号的不同返回不同的信息if request.version == "v1":return Response("v1版本的数据")elif request.version == "v2":return Response("v2版本的数据")return Response("不存在的版本")

测试视图

认证组件

我们都知道,我们可以在网站上登录~然后可以有个人中心,对自己信息就行修改
但是我们每次给服务器发请求,由于Http的无状态,导致我们每次都是新的请求
那么服务端需要对每次来的请求进行认证,看用户是否登录,以及登录用户是谁
那么我们服务器对每个请求进行认证的时候,不可能在每个视图函数中都写认证
一定是把认证逻辑抽离出来~~以前我们可能会加装饰器~或者中间件~~那我们看看DRF框架给我们提供了什么

场景

请求进来的流程

Viewclass.as_view –> APIView.as_view –> View.as_view –> return self.dispatch –> API.dispatch() -> self.initial(request, *args, **kwargs) 初始化包装view的request

在dispatch方法里~执行了initial方法~~那里初始化了我们的版本

版本的下面其实就是我们的认证,权限,频率组件了先看看认证组件

我们这个权限组件返回的是request.user,那我们这里的request是新的还是旧的呢~~

我们的initial是在我们request重新赋值之后的~所以这里的request是新的~也就是Request类实例对象~~

那这个user一定是一个静态方法~我们进去看看

认证使用方法

写一个认证的类

from rest_framework.exceptions import AuthenticationFailed
from authDemo.models import User
from rest_framework.authentication import BaseAuthenticationclass MyAuth(BaseAuthentication):def authenticate(self, request):# 做认证 看他是否登录# 从url过滤条件里拿到token# 去数据库看token是否合法# 合法的token能够获取用户信息token = request.query_params.get("token", "")if not token:raise AuthenticationFailed("没有携带token")user_obj = User.objects.filter(token=token).first()if not user_obj:raise AuthenticationFailed("token不合法")# return (None, None)return (user_obj, token)

utils/auth.py

配置全局认证


REST_FRAMEWORK = {# "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion","DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning","DEFAULT_VERSION": "v1","ALLOWED_VERSIONS": "v1, v2","VERSION_PARAM": "ver",# "DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MyAuth", ]  # 这里写的是全局认证了
}

import uuid
from .models import User
from utils.auth import MyAuthfrom rest_framework.views import APIView
from rest_framework.response import Responseclass DemoView(APIView):def get(self, request):return Response("认证demo~")class LoginView(APIView):def post(self, request):username = request.data.get("username")pwd = request.data.get("pwd")# 登录成功 生成token 会把token给你返回token = uuid.uuid4()User.objects.create(username=username, pwd=pwd, token=token)return Response("创建用户成功")class TestView(APIView):authentication_classes = [MyAuth, ]  # 局部视图认证def get(self, request):print(request.user)print(request.auth)user_id = request.user.idreturn Response("认证测试")

视图级别认证 authDemo/views.py

5

drf5 版本和认证组件相关推荐

  1. 搭建Spring Boot2.X集成Hibernate5项目,并集成传统SSH老项目的安全认证组件,以Spring Boot方式开发项目并集成到老系统

    搭建Spring Boot2.X集成Hibernate5项目,并集成传统SSH老项目的安全认证组件,以Spring Boot方式开发项目并集成到老系统 场景 可行性分析 搭建Spring Boot集成 ...

  2. rest-framework:认证组件

    一 认证简介: 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 二 局部使用 models.py class Use ...

  3. python 全栈开发,Day79(Django的用户认证组件,分页器)

    一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...

  4. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    阅读目录 认证组件 权限组件 频率组件 认证组件 权限组件 频率组件

  5. Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)

    阅读目录 一.认证组件 使用方法: token简单描述: 应用token编写登录接口: 二.权限组件 使用方法: 三.频率组件 使用方法: 一.认证组件 回到顶部 使用方法: ①写一个认证类,新建文件 ...

  6. RestFramework之认证组件

    一.认证组件的介绍 对于认证,我们一般有三种方式,即cookie, session,token, cookie,是将信息存放在客户端(浏览器上),信息不安全: session,把信息放在服务器数据库中 ...

  7. .Net Core 认证组件源码解析

    不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境怎么变,坚持自己的当初的选择,坚持信仰 .Net Cor ...

  8. 无状态shiro认证组件(禁用默认session)

    准备内容 简单的shiro无状态认证 无状态认证拦截器 import com.hjzgg.stateless.shiroSimpleWeb.Constants; import com.hjzgg.st ...

  9. Django DRF认证组件/权限组件/序列化组件综合总结(完整版)

    本代码完成的功能是: 1.根据token判断用户登录状态,然后提示用户是否登陆, 2.用户登录后,根据用户类型判断用户是否有权限查看资料 使用rest_framework一定要在配置文件设置先设置 ' ...

最新文章

  1. .Net+SQL Server企业应用性能优化笔记3——SQL查询语句
  2. java分布式面试题之Dubbo部分
  3. python爬虫 爬取bilibili新番榜
  4. 模板类的析构函数如何写_顶尖文案如何写?这6大模板、29个方法,奥美大咖都在用!|优惠最后1天...
  5. cvpr 深度估计_CVPR再现黑科技!你还在相信“眼见为实”?
  6. 2021年中国自有品牌行业发展白皮书
  7. Java Optional的使用实践概述
  8. python--------进程与线程
  9. 04-----赋值运算符
  10. oracle的磁盘测试工具orion
  11. 在secureCRT上设置常用的快捷输出按钮栏
  12. kettle MySQL blob_KETTLE BLOB 问题
  13. 【java】Spring开发中不能使用IOC的情况
  14. 开心消消乐html5游戏在线玩,开心消消乐在线玩
  15. TFS2010用户解锁
  16. windows-xp桌面图标有蓝底怎么去掉:电脑桌面图标有蓝色阴影的解决办法
  17. 调整外接显示屏亮度的方法
  18. 来给罗永浩和王自如打个分(上)
  19. monty python and the holy grail_monty python and the holy grail - 百度学术
  20. 批处理应用:IE问题修复

热门文章

  1. linux 交叉编译 nginx,交叉编译nginx,luajit
  2. centos下svn与mysql_centos下SVN搭建
  3. c# 再次尝试 连接失败_和平精英ios充值失败该怎么办
  4. layui导入模板数据_实物资产管理软件操作手册(数据接口)
  5. oracle删错表了怎么办,Oracle中表被删除或数据被错误修改后的恢复方法
  6. java空间租用_java影片租赁平台
  7. 在线运行 Linux,强的离谱!
  8. Python爬取京东笔记本电脑,来看看那个牌子最棒
  9. java 找茬,找茬。解决方法
  10. python中的defaultdict_简介Python的collections模块中defaultdict类型的用法