Django-類檢視與中介軟體
阿新 • • 發佈:2018-11-28
------類檢視
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、多箇中間件的執行順序
* 在請求檢視被處理前,中介軟體由上至下依次執行
* 在請求檢視被處理後,中介軟體由下至上依次執行