DRF 版本 認證

DRF 版本 認證

DRF的版本

1. 版本控制的做用

  • 爲了區別新舊版本,因此咱們對版本進行控制,

2.查看源碼流程

  • 執行APIView的方法,APIView返回View中的view函數,而後調用的dispatch方法python

    img

    執行self.initial方法以前是各類賦值,包括request的從新封裝賦值,下面是路由的分發框架

    img

    version版本信息賦值給了 request.version 版本控制方案賦值給了 request.versioning_scheme函數

    其實這個版本控制方案~就是咱們配置的版本控制的類~~post

    也就是說,APIView經過這個方法初始化本身提供的組件~~測試

    框架提供的哪些版本的控制方法在rest_framework.versioning裏ui

    img

詳細用法,這裏是全局使用

1.在setting.py中配置

REST_FRAMEWORK = {
    # 默認使用的版本控制類
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    # 容許的版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],
    # 版本使用的參數名稱
    'VERSION_PARAM': 'version',
    # 默認使用的版本
    'DEFAULT_VERSION': 'v1',
}

2. urls.py中配置

urlpatterns = [
    url(r"^versions", MyView.as_view()),
    url(r"^(?P<version>[v1|v2]+)/test01", TestView.as_view()),
]

3.視圖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 認證

  • 做用url

    因爲客戶端每次給服務端發請求,http是無狀態的,致使每次都是新的請求spa

    服務端要對每次來的請求進行認證,查看用戶是否登陸,以及登陸的是誰版本控制

    以往是經過加裝飾器,或者在中間件來進行認證,可是DRF給咱們提供了rest

源碼流程

執行APIView的方法,APIView返回View中的view函數,而後調用的dispatch方法,而後執行initial方法

img

點擊perform_authentication方法

img

這裏的request是封裝以後的request,全部要在Request的實例中

img

點擊查看

img

認證的詳細用法

  • 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", ]
    }

    全局認證必須認證完成纔會執行視圖中的方法

相關文章
相關標籤/搜索