1. 程式人生 > >CBV原始碼執行流程

CBV原始碼執行流程

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()),
  1. 當瀏覽器訪問/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)
  1. 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)