CBV原始碼執行流程
阿新 • • 發佈:2018-12-26
CBV原始碼執行流程:
class StudentView(View): def get(self, request): return JsonResponse({'message': 'GET請求傳送成功'}) def post(self, request): return JsonResponse({'message': 'POST請求傳送成功'}) def put(self, request): return JsonResponse({'message': 'PUT請求傳送成功'}) def delete(self, request): return JsonResponse({'message': 'DELETE請求傳送成功'})
path('student/', StudentView.as_view()),
- 當瀏覽器訪問/student/路由的時候,會執行as_view()的呼叫,as_view()返回了一個函式名叫view,所以訪問/student/路由的時候,真正是在呼叫這個view()函式;
def view(request, *args, **kwargs): # 建立了StudentView類的物件self self = cls(**initkwargs) ... # 使用StudentView類的物件self,呼叫一個方法叫dispatch(),預設去父類中呼叫這個方法。 # 這個返回值,才是get()/post()方法返回的Response,此時才交給瀏覽器。 return self.dispatch(request, *args, **kwargs)
- view()函式又執行了dispatch(),這個dispatch方法內部,才真正的去執行StudentView類中的那些方法。
def dispatch(self, request, *args, **kwargs): # 獲取當前請求的方法並且轉化成小寫,判斷是否存在於方法列表中 if request.method.lower() in self.http_method_names: # 如果存在,使用getattr()這個對映函式,將self和request.method.lower()進行對映,從得到一個handler值,這個值就是方法名(get, post,...) handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed # 呼叫hanlder(),其實就是在呼叫StudentView類中的方法。呼叫get()、post()得到一個Response()物件,這個物件並沒有直接返回給瀏覽器。而是返回到了view()函式中 return handler(request, *args, **kwargs)