DRF的版本
版本控制是作什么用的, 咱们为何要用
首先咱们要知道咱们的版本是干吗用的呢~~你们都知道咱们开发项目是有多个版本的~~服务器
当咱们项目愈来愈更新~版本就愈来愈多~~咱们不可能新的版本出了~之前旧的版本就不进行维护了~~~框架
那咱们就须要对版本进行控制~~这个DRF也给咱们提供了一些封装好的版本控制方法~~ide
版本控制怎么用
以前咱们学视图的时候知道APIView,也知道APIView返回View中的view函数,而后调用的dispatch方法~函数
那咱们如今看下dispatch方法~~看下它都作了什么~~post
执行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', }

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()

# 写视图类而且用post请求注册一个用户 class UserView(APIView): def post(self, request, *args, **kwargs): username = request.data["username"] UserInfo.objects.create(username=username, token=uuid.uuid4()) return Response("注册成功")
准备工做完成~咱们来开始咱们的认证~~

# 注意咱们这个认证的类必须实现的方法以及返回值 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", ] }
抛出异常要导入包
from rest_framework.exceptions import AuthenticationFailed
而后
raise AuthenticationFailed("认证失败")