執行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", ] }
全局認證必須認證完成纔會執行視圖中的方法