drf5 版本和认证组件
開發項目是有多個版本的
隨著項目的更新,版本就越來越多.不可能新的版本出了,以前舊的版本就不進行維護了
那我們就需要對版本進行控制,這個DRF框架也給我們提供了一些封裝好的版本控制方法
版本控制組件
流程
ViewClass.as_view –> APIView.as_view –> View.as_view –> return self.dispatch –> 找 API.dispatch() –> initial(): version, scheme = self.determine_version(request, *args, **kwargs)
APIView返回View中的view函數,然后調用的dispatch方法,那我們現在看下dispatch方法,看下它都做了什么
執行self.initial方法之前是各種賦值,包括request的重新封裝賦值,下面是路由的分發,那我們看下這個方法都做了什么
我們可以看到,我們的version版本信息賦值給了 request.version? 版本控制方案賦值給了 request.versioning_scheme~~
其實這個版本控制方案~就是我們配置的版本控制的類
也就是說,APIView通過這個方法初始化自己提供的組件
我們接下來看看框架提供了哪些版本的控制方法~~在rest_framework.versioning里~~
使用方法
REST_FRAMEWORK 的設置都在一個字典里面 rest_framework 視圖APIView的as_view 方法對View中的request 進行了封裝
版本控制代碼的實現
版本配置 DRFDemo/settings.py
REST_FRAMEWORK = {# 默認使用的版本控制類'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',# 允許的版本'ALLOWED_VERSIONS': ['v1', 'v2'],# 版本使用的參數名稱'VERSION_PARAM': 'version',# 默認使用的版本'DEFAULT_VERSION': 'v1', } 第一步 setting.py REST_FRAMEWORK = {# "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion", # 自定義的版本控制類"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning","DEFAULT_VERSION": "v1","ALLOWED_VERSIONS": "v1, v2","VERSION_PARAM": "ver" # ver=v1 }自定義版本控制類 utils/version.py
from rest_framework import versioningclass MyVersion(object):def determine_version(self, request, *args, **kwargs):# 返回值 給了request.version# 返回版本號# 版本號攜帶在過濾條件 xxxx?version=v1version = request.query_params.get("version", "v1")return version urlpatterns = [path(r"v1/", DemoView.as_view()), ] 第二步 urls.py視圖 versionDemo/views.py
from rest_framework.views import APIView from rest_framework.response import Responseclass DemoView(APIView):def get(self, request):print(request.version)print(request.versioning_scheme)# 得到版本號 根據版本號的不同返回不同的信息if request.version == "v1":return Response("v1版本的數據")elif request.version == "v2":return Response("v2版本的數據")return Response("不存在的版本") 測試視圖認證組件
我們都知道,我們可以在網站上登錄~然后可以有個人中心,對自己信息就行修改 但是我們每次給服務器發請求,由于Http的無狀態,導致我們每次都是新的請求 那么服務端需要對每次來的請求進行認證,看用戶是否登錄,以及登錄用戶是誰 那么我們服務器對每個請求進行認證的時候,不可能在每個視圖函數中都寫認證 一定是把認證邏輯抽離出來~~以前我們可能會加裝飾器~或者中間件~~那我們看看DRF框架給我們提供了什么 場景請求進來的流程
Viewclass.as_view –> APIView.as_view –> View.as_view –> return self.dispatch –> API.dispatch() -> self.initial(request, *args, **kwargs) 初始化包裝view的request
在dispatch方法里~執行了initial方法~~那里初始化了我們的版本
版本的下面其實就是我們的認證,權限,頻率組件了先看看認證組件
我們這個權限組件返回的是request.user,那我們這里的request是新的還是舊的呢~~
我們的initial是在我們request重新賦值之后的~所以這里的request是新的~也就是Request類實例對象~~
那這個user一定是一個靜態方法~我們進去看看
認證使用方法
寫一個認證的類
from rest_framework.exceptions import AuthenticationFailed from authDemo.models import User from rest_framework.authentication import BaseAuthenticationclass MyAuth(BaseAuthentication):def authenticate(self, request):# 做認證 看他是否登錄# 從url過濾條件里拿到token# 去數據庫看token是否合法# 合法的token能夠獲取用戶信息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不合法")# return (None, None)return (user_obj, token) utils/auth.py配置全局認證
REST_FRAMEWORK = {# "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion","DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning","DEFAULT_VERSION": "v1","ALLOWED_VERSIONS": "v1, v2","VERSION_PARAM": "ver",# "DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MyAuth", ] # 這里寫的是全局認證了 } import uuid from .models import User from utils.auth import MyAuthfrom rest_framework.views import APIView from rest_framework.response import Responseclass DemoView(APIView):def get(self, request):return Response("認證demo~")class LoginView(APIView):def post(self, request):username = request.data.get("username")pwd = request.data.get("pwd")# 登錄成功 生成token 會把token給你返回token = uuid.uuid4()User.objects.create(username=username, pwd=pwd, token=token)return Response("創建用戶成功")class TestView(APIView):authentication_classes = [MyAuth, ] # 局部視圖認證def get(self, request):print(request.user)print(request.auth)user_id = request.user.idreturn Response("認證測試") 視圖級別認證 authDemo/views.py5
總結
以上是生活随笔為你收集整理的drf5 版本和认证组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: drf4 视图与路由组件
- 下一篇: drf6 权限和频率控制组件