DRF 版本 認證

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',
}
第一步 setting.py
urlpatterns = [
    url(r"^versions", MyView.as_view()),
    url(r"^(?P<version>[v1|v2]+)/test01", TestView.as_view()),
]
第二步 urls.py
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()
models.py
# 寫視圖類而且用post請求註冊一個用戶

class UserView(APIView):
    def post(self, request, *args, **kwargs):
        username = request.data["username"]
        UserInfo.objects.create(username=username, token=uuid.uuid4())
        return Response("註冊成功")
views.py

準備工做完成~咱們來開始咱們的認證~~

# 注意咱們這個認證的類必須實現的方法以及返回值
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("認證失敗")
相關文章
相關標籤/搜索