Django-Rest-Framework的版本和認證

Django-Rest-Framework的版本和認證

DRF的版本

版本控制是作什麼用的,咱們爲何要用

首先要知道版本是幹嗎用的,咱們知道開發項目的時候有多個版本

當項目一直更新,版本就愈來愈多,之前的舊版本就不維護了

那這時,就須要對版本進行控制,這個DRF也給咱們提供了一些封裝好的版本控制方法

版本控制怎麼用

以前視圖篇介紹了APIView,也只帶APIView返回View中的view函數而後調用的dispach方法

那看一下dispatch方法,看下它都作了些什麼
執行self.initial方法以前是各類賦值,包括request的從新封裝,下面是路由分發,那咱們看這個方法遼作了什麼。
能夠看到,version版本信息賦值給了request.version 版本控制方案賦值給了request.versioning_scheme

這個版本控制方案就是配置的版本控制的類

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

接下來看一下框架提供了那些版本的控制方法  ---- 在rest_framework.versioning
框架一共給咱們提供了這幾個版本的控制方法,這裏只給出一個,其餘配置相同

詳細用法

第一步 settings.py

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

第二步 urls.py

 
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("根本就匹配不到這個路由")

其餘版本控制的類,配置方法差很少都同樣服務器

DRF的認證

認證是幹什麼用的

咱們都知道,咱們能夠在網站上登陸,而後能夠有我的中心,對本身信息進行修改
可是咱們每次給服務器發請求,因爲Http的無狀態,致使咱們每次都是新的請求
那麼服務端須要對每次來的請求進行認證,看用戶是否登陸,以及登陸用戶是誰
那麼咱們服務器對每一個請求進行認證的時候,不可能在每一個視圖函數中都寫認證
必定是把認證邏輯抽離出來,之前咱們可能會加裝飾器,或者中間件,來看看DRF框架提供了什麼

認證怎麼用

上面版本控制的時候咱們能夠知道,在dispatch 方法裏,執行了initial方法,那初始化了咱們的版本

若是認證讀的話,能夠看到,版本的下面就是咱們的認證,權限,頻率組件。

認證組件restful

咱們進去認證看框架

咱們這個權限組件返回的是request.user,那麼咱們這裏的request是新的仍是舊的呢

咱們的initial是咱們request從新賦值以後的,所因此這裏的request是新的,也就是Request類實例對象

那這個user必定是一個靜態方法,進去一探究竟
這裏沒有給出反覆的跳轉截圖,自行仔細跳轉
經過上面基本能夠知道,咱們的認證類必定要實現的方法,以及返回值類型,
以及配置的參數authentication_classes

請看具體用法ide

認證的詳細用法

寫一個認證demo,先建一張用戶表,字段爲爲用戶名以及對應的token值函數

models.py

 
# 先在model中註冊模型類
# 而且進行數據遷移
# 測試我就簡寫了~

class UserInfo(models.Model):
username = models.CharField(max_length=32)
token = models.UUIDField()

views.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("註冊成功")

認證開始

寫一個認證的類

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