• DRF 版本和认证


    DDRF的版本

    版本控制怎么用

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

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

    执行self.initial方法之前是各种赋值,包括request的重新封装赋值,下面是路由的分发,下图是initial的源码:

    在rest_framework.versioning中我们能看到框架提供了那些版本的控制方法

    详细用法

    URL上携带版本信息的配置

    第一步 settings.py

    REST_FRAMEWORK = {
        # 默认使用的版本控制类
        'DEFAULT_VERSIONING_CLASS': 'utils.version.MyVersion',
        # 允许的版本
        'DEFAULT_VERSION': None,
        # 版本使用的参数名称
        'ALLOWED_VERSIONS': None,
        # 默认使用的版本
        'VERSION_PARAM': 'version'
    }  

    第二步 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的认证

    认证怎么用

    认证组件

    点认证组件方法进去看一下:

    我们这个权限组件返回的是request.user,这里的request是initial方法重新赋值后的,所以是新的~也就是Request类实例化对象

    点user进去看看:

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

    认证的详细用法

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

    models.py

    rom django.db import models


    # Create your models here.

    class User(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    token = models.UUIDField(null=True, blank=True)

    views.py  

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .models import User
    import uuid
    from .auth import MyAuth
    
    
    # Create your views here.
    
    class LoginView(APIView):
        def post(self, request):
            name = request.data.get('name', '')
            pwd = request.data.get('pwd', '')
            # 校验用户名和密码是否正确
            user_obj = User.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('用户名或密码错误')

     接下来正式认证:

      写一个认证的类

    # 注意我们这个认证的类必须实现的方法以及返回值
    from .models import User
    from rest_framework.exceptions import AuthenticationFailed
    from rest_framework.authentication import BaseAuthentication
    
    
    class MyAuth(BaseAuthentication):
        def authenticate(self, request):
            # 认证逻辑
            # 拿到前端传过来的token
            # 判断token是否存在
    # query_params是我们常用的GET请求 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不合法') # request.user request.auth return (user_obj, token)

      视图级别认证

    class TestView(APIView):
        # 把自定义的类传递过来
        authentication_classes = [MyAuth, ]
    
        def get(self, request):
            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", ]
    }
    

      

  • 相关阅读:
    利用CSS计数函数counter()实现计数
    弹跳加载动画特效Bouncing loader
    HTML页面中解决内容元素随窗口变化布局变乱问题
    CSS中列表项list样式
    框模型中设置内容区域元素占地尺寸box-sizing属性
    PHP100视频教程-->视频下载
    HTML页面中5种超酷的伪类选择器:hover效果
    HTML中获取input中单选按钮radio数据(性别例子)
    HTML中 DOM操作的Document 对象详解(收藏)
    14、输入一个链表,从尾到头打印链表每个节点的值。
  • 原文地址:https://www.cnblogs.com/wjs521/p/9985763.html
Copyright © 2020-2023  润新知