版本控制
  -- # 初始化我们的版本
   version, scheme = self.determine_version(request, *args, **kwargs)
   request.version, request.versioning_scheme = version, scheme
  --  def determine_version(self, request, *args, **kwargs):
    if self.versioning_class is None:
     return (None, None)
    scheme = self.versioning_class()
    # scheme我配置的版本控制类的实例化对象
    # 调用了determine_version(request, *args, **kwargs)
    # 把方法的返回值给version
    return (scheme.determine_version(request, *args, **kwargs), scheme)

setting设置:

#版本配置REST_FRAMEWORK = {    "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion",    'DEFAULT_VERSION': None,    'ALLOWED_VERSIONS': None,    'VERSION_PARAM': 'version'}新见文件夹 及文件(版本代码)
class MyVersion(object):    def determine_version(self, request, *args, **kwargs):        # 方法的返回值是版本号        # 获取前端传过来的版本号 并且把版本号返回        version = request.query_params.get("version")        if not version:            version = "v1"        return version新见文件夹 及文件(认证代码)
from .models import Usr#此处抛异常 from rest_framework.exceptions import AuthenticationFailed# 认证 用到了框架的基本方法from rest_framework.authentication import BaseAuthentication

class Myauth(BaseAuthentication):    #def authenticate(self, request)框架自带方法    def authenticate(self, request):        # 认证逻辑        # 拿到前端传过来的token        # 判断token是否存在        token=request.query_params.get('token','')        if not token:            raise AuthenticationFailed('缺少token')        user_obj=Usr.objects.filter(token=token).first()        if  not user_obj:            raise AuthenticationFailed("token不合法")        #源码返回的参数 request.user  request.auth        #返回哪个对象和 和token        return (user_obj,token)视图代码(认证)
from django.shortcuts import renderfrom rest_framework.views import APIViewfrom rz import modelsimport  uuid  #token 设置from rest_framework.response import Responsefrom rz.auth import Myauth #认证from rz.permission import Mypermission #权限from  .throttle import Mythrottle,DRFthrottle

#认证class Login(APIView):    def post(self,request):        name=request.data.get('name','')        pwd=request.data.get('pwd','')        user_obj=models.Usr.objects.filter(name=name,pwd=pwd).first()        if user_obj:            user_obj.token=uuid.uuid4()            user_obj.save()            return  Response(user_obj.token)        else:            return Response('用户名或密码')

#测试认证组件class Testo(APIView):    authentication_classes = [Myauth,]    def get(self,request):        return Response("测试认证组件")

DRF的版本

版本控制是做什么用的, 我们为什么要用

首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~

当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~以前旧的版本就不进行维护了~~~

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

版本控制怎么用

之前我们学视图的时候知道APIView,也知道APIView返回View中的view函数,然后调用的dispatch方法~

那我们现在看下dispatch方法~~看下它都做了什么~~

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

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

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

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

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

框架一共给我们提供了这几个版本控制的方法~~我们在这里只演示一个~~因为基本配置都是一样的~~

详细用法

我们看下放在URL上携带版本信息怎么配置~~

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

第一步 setting.py

urlpatterns = [
    url(r"^versions", MyView.as_view()),
    url(r"^(?P<version>[v1|v2]+)/test01", TestView.as_view()),
]

第二步 urls.py

class TestView(APIView):
    def get(self, request, *args, **kwargs):
        print(request.versioning_scheme)
        ret = request.version
        if ret == "v1":
            return Response("版本v1的信息")
        elif ret == "v2":
            return Response("版本v2的信息")
        else:
            return Response("根本就匹配不到这个路由")

测试视图

其他的版本控制的类,配置方法都差不多~~这里就不一一例举了~~

DRF的认证

认证是干嘛的呢~

我们都知道~我们可以在网站上登录~然后可以有个人中心,对自己信息就行修改~~~

但是我们每次给服务器发请求,由于Http的无状态,导师我们每次都是新的请求~~

那么服务端需要对每次来的请求进行认证,看用户是否登录,以及登录用户是谁~~

那么我们服务器对每个请求进行认证的时候,不可能在每个视图函数中都写认证~~~

一定是把认证逻辑抽离出来~~以前我们可能会加装饰器~或者中间件~~那我们看看DRF框架给我们提供了什么~~~

认证怎么用

上面讲版本的时候我们知道~在dispatch方法里~执行了initial方法~~那里初始化了我们的版本~~

如果我们细心我们能看到~版本的下面其实就是我们的认证,权限,频率组件了~~

我们先看看我们的认证组件~~

我们进去我们的认证看下~~

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

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

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

我没在这里反复的截图跳转页面~~大家可以尝试着自己去找~~要耐心~~细心~~

我们通过上面基本可以知道我们的认证类一定要实现的方法~~以及返回值类型~~以及配置的参数authentication_classes~

下面我们来看看具体用法~~~

认证的详细用法

我们先写个认证的小demo~~我们先建一个用户表~字段为用户名以及对应的token值~~

# 先在model中注册模型类
# 并且进行数据迁移
# 测试我就简写了~

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    token = models.UUIDField()

models.py

# 写视图类并且用post请求注册一个用户

class UserView(APIView):
    def post(self, request, *args, **kwargs):
        username = request.data["username"]
        UserInfo.objects.create(username=username, token=uuid.uuid4())
        return Response("注册成功")

views.py

准备工作完成~我们来开始我们的认证~~

# 注意我们这个认证的类必须实现的方法以及返回值
class MyAuth(BaseAuthentication):

    def authenticate(self, request):
        request_token = request.query_params.get("token", None)
        if not request_token:
            raise AuthenticationFailed({"code": 1001, "error": "缺少token"})
        token_obj = UserInfo.objects.filter(token=request_token).first()
        if not token_obj:
            raise AuthenticationFailed({"code": 1001, "error": "无效的token"})
        return token_obj.username, token_obj

写一个认证的类

class TestAuthView(APIView):
    authentication_classes = [MyAuth, ]

    def get(self, request, *args, **kwargs):
        return Response("测试认证")

视图级别认证

REST_FRAMEWORK = {
    # 默认使用的版本控制类
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    # 允许的版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],
    # 版本使用的参数名称
    'VERSION_PARAM': 'version',
    # 默认使用的版本
    'DEFAULT_VERSION': 'v1',
    # 配置全局认证
    'DEFAULT_AUTHENTICATION_CLASSES': ["BRQP.utils.MyAuth", ]
}

DRF 版本 及认证的更多相关文章

  1. DRF 版本和认证

    Django Rest Framework 版本控制组件 DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们 ...

  2. DRF 版本、认证、权限、限制、解析器和渲染器

    目录 一.DRF之版本控制 为什么要有版本控制? DRF提供的版本控制方案 版本的使用 全局配置 局部配置(使用较少) 二.DRF之认证 内置的认证 步骤 三.DRF之权限 1.自定义一个权限类 2. ...

  3. DRF的版本、认证、权限

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...

  4. drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件

    1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...

  5. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  6. Django-Rest-Framework的版本和认证

    Django-Rest-Framework的版本和认证   restful framework DRF的版本 版本控制是做什么用的,我们为什么要用 首先要知道版本是干嘛用的,我们知道开发项目的时候有多 ...

  7. drf(请求封装/认证/权限/节流)

    1.请求的封装 class HttpRequest(object): def __init__(self): pass @propery def GET(self): pass @propery de ...

  8. DRF版本组件

    1.DRF版本组件配置类局部使用 局部配置: 方式一:直接配置versioning_class=QueryParameterVersioning 方式二:直接配置versioning_class=UR ...

  9. DRF框架之认证组件用法(第四天)

    1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...

随机推荐

  1. linux centos6 yum 安装lamp

    centos 6.5 1.yum安装和源代码编译在使用的时候没啥区别,但是安装的过程就大相径庭了,yum只需要3个命令就可以完成,源代码需要13个包,还得加压编译,步骤很麻烦,而且当做有时候会出错,源 ...

  2. dashboard无法查到endpoint, counter

    问题 使用Open-falcon时,Agent 推送metrics后,无法在Dashboard上显示.将Agent的hostname 修改后,却可以. 解决办法 查看Agent log,推送到tran ...

  3. hanlp源码解析之中文分词算法详解

    词图 词图指的是句子中所有词可能构成的图.如果一个词A的下一个词可能是B的话,那么A和B之间具有一条路径E(A,B).一个词可能有多个后续,同时也可能有多个前驱,它们构成的图我称作词图. 需要稀疏2维 ...

  4. T-SQL like charindex patindex 性能比较

    事实上在网上可以找到很多这方面的资料,在这边就不多说了~主要观点在性能方面还是比较倾向于charindex,下面就测试下: 测试环境:共50批次,每批次50000数据,测试总共250万数据. 一.li ...

  5. 【Linux】使用fsck对磁盘进行修复

    在后台执行 磁盘修复 nohup fsck.ext3 -y /dev/sdb1 > /root/fsck.log 2>&1 & 使用nohup和& 让进程在后台执行 ...

  6. live555峰哥的私房菜(二)-----计划任务(TaskScheduler)探讨

    计划任务(TaskScheduler)探讨 上一篇谈到SingleStep()函数会找到三种任务类型并执行之. 这三种任务是: socket handler, event handler, delay ...

  7. DB2如何将数据库表解锁

    死锁是应用程序争抢资源造成de,把相关应用程序结束掉就可以解除死锁了 先用list application for database yourdatabasename show detail 来看看应 ...

  8. 『Hi,我是易建科技eKing Cloud!』

    写在前面:这是我的第一篇自我介绍式文章,是对易建科技我所在云服务事业群的云平台产品和业务的总结和介绍.本文始发于 Linux宝库 公众号,这是原文链接.感谢公众号主人陈绪总,感谢公众号的编辑们!感谢易 ...

  9. 微信小程序调用微信登陆获取openid及用户信息 java做为服务端

    转载的文章,很不错 https://blog.csdn.net/weilai_zhilu/article/details/77932630

  10. get和post的解析

    get 直接获取数据 post 将数据发送到服务端缓存下来,当无法缓存数据或用户输入未知字符时用post, get:常用于数据 post:不想缓存数据,不再浏览器中缓存数据,在服务端可以,因为取数据及 ...