一、知識儲備
1 APIview的as_view -內部還是執行了View的閉包函式view -禁用掉了csrf -一切皆物件,函式也是物件 函式地址.name=lili 2 原生View類中過的as_view中的閉包函式view -本質執行了self.dispatch(request, *args, **kwargs),執行的是APIView的dispatch
二、APIView的原始碼分析
# drf:APIView的原始碼分析 def as_view(cls, **initkwargs): # 這句話執行完成回傳 view閉包函式的記憶體地址 view = super().as_view(**initkwargs) # 呼叫父類(View)的as_view view.cls = cls view.initkwargs = initkwargs view=csrf_exempt(view) # 區域禁用csrf return view # 裝飾器的使用方式 @csrf_exempt ====>view=csrf_exempt(view) def view(): pass # 請求來了,會執行上面回傳的view()---->self.dispatch(APIView的dispatch)
三、APIView的dispatch原始碼分析
# APIView的dispatch原始碼分析 def dispatch(self, request, *args, **kwargs): # 把原生的request,封裝進新的Request物件(drf的Request) # DRF的Request類的物件,內部有request._request,它就是原生request request = self.initialize_request(request, *args, **kwargs) self.request = request try: self.initial(request, *args, **kwargs) ''' #認證,權限,頻率 self.perform_authentication(request) self.check_permissions(request) self.check_throttles(request) ''' if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed # 這個request新的requst,是drf中Request物件 # response是原生response response = handler(request, *args, **kwargs) except Exception as exc: # 全域的例外捕獲 response = self.handle_exception(exc) # 把視圖函式(類)回傳的response,又包裝了一下 self.response = self.finalize_response(request, response, *args, **kwargs) return self.response
四、Request類分析
Request類 -request._request:原生request -request.data : post請求提交的資料(urlencoded,json,formdata) -request.user :不是原生的user了 -request.query_params :原生的request.GET,為了遵循restful規范 -requset.FILES :新的 -重寫了__getattr__,新的request.原來所有的屬性和方法,都能直接拿到 def __getattr__(self, attr): return getattr(self._request, attr)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/202824.html
標籤:其他
上一篇:drf—— 序列化組件
下一篇:drf—— 序列化組件
