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