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", ]
}

  

原文地址:https://www.cnblogs.com/wjs521/p/9985763.html