执行APIView的方法,APIView返回View中的view函数,而后调用的dispatch方法python
执行self.initial方法以前是各类赋值,包括request的从新封装赋值,下面是路由的分发框架
version版本信息赋值给了 request.version 版本控制方案赋值给了 request.versioning_scheme函数
其实这个版本控制方案~就是咱们配置的版本控制的类~~post
也就是说,APIView经过这个方法初始化本身提供的组件~~测试
框架提供的哪些版本的控制方法在rest_framework.versioning里ui
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("根本就匹配不到这个路由")
做用url
因为客户端每次给服务端发请求,http是无状态的,致使每次都是新的请求spa
服务端要对每次来的请求进行认证,查看用户是否登陆,以及登陆的是谁版本控制
以往是经过加装饰器,或者在中间件来进行认证,可是DRF给咱们提供了rest
执行APIView的方法,APIView返回View中的view函数,而后调用的dispatch方法,而后执行initial方法
点击perform_authentication方法
这里的request是封装以后的request,全部要在Request的实例中
点击查看
model.py 简单写一些字段,
class UserInfo(models.Model): username = models.CharField(max_length=32) token = models.UUIDField()
view.py
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", ] }
全局认证必须认证完成才会执行视图中的方法