zoukankan      html  css  js  c++  java
  • DRF版本和认证

    DRF版本 :

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

      开发项目时有多个版本的, 当我们的项目越来越新, 版本就越来越多, 我们不可能新的版本出来了, 旧的版本就不去维护, 所以我们就需要对版本进行控制, 这个DRF也给我们提供了一些封装好的版本控制方法. 

    版本控制怎么用?

      在视图中的APIView是返回View中的view函数, 然后调用display方法, 现在我们看下display方法中具体做了什么 :

      可以看到执行self.initial方法之前呢是各种的赋值, 包括request的重新封装赋值, 下面是路由的分发, 看下它做了什么 :

      可以看到, version版本信息赋值给了request.version,

      版本控制方案赋值给了request.versionong_scheme.

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

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

    下面是框架提供的版本控制方法, 在rest_framework.versionong中:

    详细用法演示(在url中携带版本信息) :

    REST_FRAMEWORK = {
        # 默认使用的版本控制类
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        # 允许的版本
        'ALLOWED_VERSIONS': ['v1', 'v2'],
        # 版本使用的参数名称
        'VERSION_PARAM': 'version',
        # 默认使用的版本
        'DEFAULT_VERSION': 'v1',
    }
    settings.py
    urlpatterns = [
        url(r"^versions", MyView.as_view()),
        url(r"^(?P<version>[v1|v2]+)/test01", TestView.as_view()),
    ]
    url
    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, 由于initial是在request重新赋值之后的方法, 所以这里的request是新的, 也就是Request类的实例化对象.

      那这个user一定是一个静态方法.

      通过源码基本可以知道认证类一定要实现的方法以及返回值类型, 以及配置的参数authentication_classes

    认证的详细用法举例 :

      先建一个用户表,字段为用户名以及对应的token值

    # 先在model中注册模型类
    # 并且进行数据迁移
    # 测试我就简写了~
    
    class UserInfo(models.Model):
        username = models.CharField(max_length=32)
        token = models.UUIDField()
    model.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("注册成功")
    View.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", ]
    }
    全局配置认证
  • 相关阅读:
    【原创】基于Altera DE2的数字实验—001_1 (DE2)(Digital Logical)(Verilog)
    【笔记】Excel技巧—012 隔行插入
    【笔记】Excel技巧016使用语音校验输入准确性
    【翻译】Nios design contest 2007001
    【笔记】Excel技巧—014 多窗口协同作业
    【笔记】Excel技巧—013 方便查看标题的“冻结窗格”功能
    【翻译】Nios II处理器简介 (Nios II)
    【笔记】Excel技巧—011 改变工作表标签颜色与字号
    【原创】DE2实验解答—lab7 (Quartus II)(Digital Logic)(Verilog HDL)
    【笔记】Linux基础—001 安装CentOS5.6
  • 原文地址:https://www.cnblogs.com/dong-/p/9980260.html
Copyright © 2011-2022 走看看