DRF 版本 认证
DRF 版本 認證
DRF的版本
1. 版本控制的作用
- 為了區別新舊版本,所以我們對版本進行控制,
2.查看源碼流程
執行APIView的方法,APIView返回View中的view函數,然后調用的dispatch方法
執行self.initial方法之前是各種賦值,包括request的重新封裝賦值,下面是路由的分發
version版本信息賦值給了 request.version 版本控制方案賦值給了 request.versioning_scheme
其實這個版本控制方案~就是我們配置的版本控制的類~~
也就是說,APIView通過這個方法初始化自己提供的組件~~
框架提供的哪些版本的控制方法在rest_framework.versioning里
詳細用法,這里是全局使用
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.versionif ret == "v1":return Response("版本v1的信息")elif ret == "v2":return Response("版本v2的信息")else:return Response("根本就匹配不到這個路由")DRF 認證
作用
由于客戶端每次給服務端發請求,http是無狀態的,導致每次都是新的請求
服務端要對每次來的請求進行認證,查看用戶是否登錄,以及登錄的是誰
以往是通過加裝飾器,或者在中間件來進行認證,但是DRF給我們提供了
源碼流程
執行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", ] }全局認證必須認證完成才會執行視圖中的方法
轉載于:https://www.cnblogs.com/yuncong/p/10129005.html
總結
- 上一篇: 转行提升之路
- 下一篇: Spring框架整合JUnit单元测试