drf5 版本和认证组件
开发项目是有多个版本的
随着项目的更新,版本就越来越多.不可能新的版本出了,以前旧的版本就不进行维护了
那我们就需要对版本进行控制,这个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 versioning class MyVersion(object):
def determine_version(self, request, *args, **kwargs):
# 返回值 给了request.version
# 返回版本号
# 版本号携带在过滤条件 xxxx?version=v1
version = 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 Response class 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 BaseAuthentication class 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 MyAuth from rest_framework.views import APIView
from rest_framework.response import Response class 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.id
return Response("认证测试")
视图级别认证 authDemo/views.py
5
drf5 版本和认证组件的更多相关文章
- drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件
1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...
- DRF 版本和认证
Django Rest Framework 版本控制组件 DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们 ...
- DRF 版本 及认证
版本控制 -- # 初始化我们的版本 version, scheme = self.determine_version(request, *args, **kwargs) request.v ...
- DRF的版本、认证、权限
DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...
- DRF的版本和认证
DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...
- Django的用户认证组件,自定义分页
一.用户认证组件 1.auth模块 from django.conrtrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1)authen ...
- Django-Rest-Framework的版本和认证
Django-Rest-Framework的版本和认证 restful framework DRF的版本 版本控制是做什么用的,我们为什么要用 首先要知道版本是干嘛用的,我们知道开发项目的时候有多 ...
- Django-restframework 源码之认证组件源码分析
Django-restframework 源码之认证组件源码分析 一 前言 之前在 Django-restframework 的流程分析博客中,把最重要的关于认证.权限和频率的方法找到了.该方法是 A ...
- Django学习之九: auth 认证组件
目录 Django auth 认证组件 配置使用auth组件及其中间件 request.user 可以直接在template模版中使用 auth组件常用api 获取认证model类 认证检测装饰器@l ...
随机推荐
- (dev mode) install CONSUL on ubuntu
WSL: V18.04.1 1. install $sudo apt-get update$sudo apt-get install consul wsl1017@DESKTOP-14G6K9S:~$ ...
- python第三方库Requests的基本使用
Requests 是用python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...
- java 解耦
探索目的:使用的时候,只需要一次调用就可以完成日常复杂的操作.而工具类的高耦合带来业务代码维护复杂度加大.以 java 的思想对原始工具加以改进. 有没有比这里尝试的方法更高明的,在 A_Utils. ...
- laravel代码生成器的记录
在使用laravel5.5时,关于代码生成器还有很多的功能不明白 是么回事,在此先记录下来过程. 1.composer reqiure summerblue/generator --dev php a ...
- 学习:D3
http://www.ourd3js.com/wordpress/?p=196 http://www.ourd3js.com/demo/rm/R-9.2/force.html 力导向图(那个可以拖拽的 ...
- PHP响应码和HTTP请求方法
HTTP请求报文由请求行(request line).请求头部(header).空行和请求数据4个部分组成,格式如下 可见请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格 ...
- 1.Ansible安装以及配置
本节内容以Centos7为系统环境进行讲解: 1.安装epel源,方便直接yum安装: wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun ...
- mysql win10x64 免安装版 安装配置
安装包下载或者 gaobo百度云/工具/开发工具/mysql-5.7.23-winx64.zip 第一步, 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下,我的解压目录是: ...
- 微信小程序--数据存储
对本地缓存数据操作分为同步和异步两种.同步方法有成功回调函数,表示数 据处理成功后的操作.下面是小程序提供本地缓存操作接口: 以Sync结尾都是同步方法.同步方法和异步方法的区别是: 同步方法会堵塞当 ...
- 深入浅出PF 学习笔记---通过资源文件设置按钮的Style及通过x:null设置不受Style影响
<Window x:Class="WpfStudy2018.StyleButton" xmlns="http://schemas.microsoft.com/win ...