1. 程式人生 > >Django-類檢視與中介軟體

Django-類檢視與中介軟體

------類檢視 1、類檢視引入 def register(request): """處理註冊"""   # 獲取請求方法,判斷是GET/POST請求 if request.method == 'GET': # 處理GET請求,返回註冊頁面 return render(request, 'register.html') else: # 處理POST請求,實現註冊邏輯 return HttpResponse('這裡實現註冊邏輯')   from django.views.generic import View   class RegisterView(View): """類檢視:處理註冊"""   def get(self, request): """處理GET請求,返回註冊頁面""" return render(request, 'register.html')   def post(self, request): """處理POST請求,實現註冊邏輯""" return HttpResponse('這裡實現註冊邏輯')   類檢視的好處: * 程式碼可讀性好 * 類檢視相對於函式檢視有更高的複用性, 如果其他地方需要用到某個類檢視的某個特定邏輯,直接繼承該類檢視即可   2、類檢視使用 from django.views.generic import View   urlpatterns = [ # 檢視函式:註冊 # url(r'^register/$', views.register, name='register'), # 類檢視:註冊 url(r'^register/$', views.RegisterView.as_view(), name='register'), ]     3、類檢視原理 @classonlymethod def as_view(cls, **initkwargs): """ Main entry point for a request-response process. """ ...省略程式碼...   def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request self.args = args self.kwargs = kwargs # 呼叫dispatch方法,按照不同請求方式呼叫不同請求方法 return self.dispatch(request, *args, **kwargs)   ...省略程式碼...   # 返回真正的函式檢視 return view     def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. 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 return handler(request, *args, **kwargs)   4、類檢視使用裝飾器   def my_decorator(func): def wrapper(request, *args, **kwargs): print('自定義裝飾器被呼叫了') print('請求路徑%s' % request.path) return func(request, *args, **kwargs) return wrapper   class DemoView(View): def get(self, request): print('get方法') return HttpResponse('ok')   def post(self, request): print('post方法') return HttpResponse('ok')   4-1、在URL配置中裝飾 urlpatterns = [ url(r'^demo/$', my_decorate(DemoView.as_view())) ]   4-2、 在類檢視中裝飾 from django.utils.decorators import method_decorator   # 為全部請求方法新增裝飾器class DemoView(View):   @method_decorator(my_decorator) def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs)   def get(self, request): print('get方法') return HttpResponse('ok')   def post(self, request): print('post方法') return HttpResponse('ok')     # 為特定請求方法新增裝飾器class DemoView(View):   @method_decorator(my_decorator) def get(self, request): print('get方法') return HttpResponse('ok')   def post(self, request): print('post方法') return HttpResponse('ok')     4-3 構造Mixin擴充套件類 class MyDecoratorMixin(object): @classmethod def as_view(cls, *args, **kwargs): view = super().as_view(*args, **kwargs) view = my_decorator(view) return view   class DemoView(MyDecoratorMixin, View): def get(self, request): print('get方法') return HttpResponse('ok')   def post(self, request): print('post方法') return HttpResponse('ok')     -----中介軟體 Django中的中介軟體是一個輕量級、底層的外掛系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。中介軟體的設計為開發者提供了一種無侵入式的開發方式,增強了Django框架的健壯性。 我們可以使用中介軟體,在Django處理檢視的不同階段對輸入或輸出進行干預。   1、中介軟體的定義方法 def simple_middleware(get_response): # 此處編寫的程式碼僅在Django第一次配置和初始化的時候執行一次。   def middleware(request): # 此處編寫的程式碼會在每個請求處理檢視前被呼叫。   response = get_response(request)   # 此處編寫的程式碼會在每個請求處理檢視之後被呼叫。   return response   return middleware   def my_middleware(get_response): print('init 被呼叫') def middleware(request): print('before request 被呼叫') response = get_response(request) print('after response 被呼叫') return response return middleware     # 定義好中介軟體後,需要在settings.py檔案中添加註冊中介軟體 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', ' django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'users.middleware.my_middleware', # 新增中介軟體 ] 2、多箇中間件的執行順序 * 在請求檢視被處理前,中介軟體由上至下依次執行 * 在請求檢視被處理後,中介軟體由下至上依次執行