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", ]
    }
    全局配置认证
  • 相关阅读:
    优先队列
    Problem W UVA 662 二十三 Fast Food
    UVA 607 二十二 Scheduling Lectures
    UVA 590 二十一 Always on the run
    UVA 442 二十 Matrix Chain Multiplication
    UVA 437 十九 The Tower of Babylon
    UVA 10254 十八 The Priest Mathematician
    UVA 10453 十七 Make Palindrome
    UVA 10163 十六 Storage Keepers
    UVA 1252 十五 Twenty Questions
  • 原文地址:https://www.cnblogs.com/dong-/p/9980260.html
Copyright © 2011-2022 走看看