DRF 版本和认证
DDRF的版本
版本控制怎么用
之前我们学视图的时候知道APIView,也知道APIView返回View中的view函数,然后调用的dispatch方法~
我们现在看下dispatch方法~~做了什么
执行self.initial方法之前是各种赋值,包括request的重新封装赋值,下面是路由的分发,下图是initial的源码:
在rest_framework.versioning中我们能看到框架提供了那些版本的控制方法
详细用法
URL上携带版本信息的配置
第一步 settings.py
1 2 3 4 5 6 7 8 9 10 | REST_FRAMEWORK = { # 默认使用的版本控制类 'DEFAULT_VERSIONING_CLASS' : 'utils.version.MyVersion' , # 允许的版本 'DEFAULT_VERSION' : None , # 版本使用的参数名称 'ALLOWED_VERSIONS' : None , # 默认使用的版本 'VERSION_PARAM' : 'version' } |
第二步 urls.py
1 2 3 4 | urlpatterns = [ url(r "^versions" , MyView.as_view()), url(r "^(?P<version>[v1|v2]+)/test01" , TestView.as_view()), ] |
测试视图
1 2 3 4 5 6 7 8 9 10 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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( '用户名或密码错误' ) |
接下来正式认证:
写一个认证的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 注意我们这个认证的类必须实现的方法以及返回值 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是否存在<br> # 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) |
视图级别认证
1 2 3 4 5 6 | class TestView(APIView): # 把自定义的类传递过来 authentication_classes = [MyAuth, ] def get( self , request): return Response( '测试认证组件' ) |
全局配置认证
1 2 3 4 5 6 7 8 9 10 11 12 | 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" , ] } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步