zoukankan      html  css  js  c++  java
  • Django-Rest-Framework的版本和认证

    Django-Rest-Framework的版本和认证

    DRF的版本

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

    首先要知道版本是干嘛用的,我们知道开发项目的时候有多个版本
    
    当项目一直更新,版本就越来越多,以前的旧版本就不维护了
    
    那这时,就需要对版本进行控制,这个DRF也给我们提供了一些封装好的版本控制方法
    

    版本控制怎么用

    之前视图篇介绍了APIView,也只带APIView返回View中的view函数然后调用的dispach方法
    
    那看一下dispatch方法,看下它都做了些什么
    
    执行self.initial方法之前是各种赋值,包括request的重新封装,下面是路由分发,那我们看这个方法辽做了什么。
    
    可以看到,version版本信息赋值给了request.version 版本控制方案赋值给了request.versioning_scheme
    
    这个版本控制方案就是配置的版本控制的类
    
    也就是说,APIView通过这个方法初始化自己提供的组件
    
    接下来看一下框架提供了那些版本的控制方法  ---- 在rest_framework.versioning
    
    框架一共给我们提供了这几个版本的控制方法,这里只给出一个,其他配置相同
    

    详细用法

    第一步 settings.py

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

    第二步 urls.py

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

    测试视图

     
    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值

    models.py

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

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

    views.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("注册成功")

    认证开始

    写一个认证的类

     
    # 注意我们这个认证的类必须实现的方法以及返回值
    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", ]
    }
  • 相关阅读:
    Entity Framework中的多个库操作批量提交、事务处理
    Entity Framework with NOLOCK
    在Entity Framework 中执行T-sql语句
    Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)
    Visual Studio 2010 更新NuGet Package Manager出错解决办法
    html判断IE版本
    Java基础-学习笔记(七)——this关键字
    Java基础-学习笔记(六)——类的封装性
    Java基础-学习笔记(五)——面向过程和面向对象的区别
    Java基础-学习笔记(四)-流程控制
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/9885390.html
Copyright © 2011-2022 走看看