DRF 版本 认证

DRF的版本

版本控制是作什么用的, 咱们为何要用

首先咱们要知道咱们的版本是干吗用的呢你们都知道咱们开发项目是有多个版本的服务器

当咱们项目愈来愈更新~版本就愈来愈多咱们不可能新的版本出了~之前旧的版本就不进行维护了~框架

那咱们就须要对版本进行控制这个DRF也给咱们提供了一些封装好的版本控制方法函数

版本控制怎么用

以前咱们学视图的时候知道APIView,也知道APIView返回View中的view函数,而后调用的dispatch方法~post

那咱们如今看下dispatch方法看下它都作了什么

执行self.initial方法以前是各类赋值,包括request的从新封装赋值,下面是路由的分发,那咱们看下这个方法都作了什么~~
测试

咱们能够看到,咱们的version版本信息赋值给了 request.version 版本控制方案赋值给了 request.versioning_scheme~~网站

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

也就是说,APIView经过这个方法初始化本身提供的组件~~url

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

框架一共给咱们提供了这几个版本控制的方法咱们在这里只演示一个由于基本配置都是同样的~~spa

详细用法

咱们看下放在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()),
]
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", ]
}

全局配置认证