Django:(05)類檢視,裝飾器和中介軟體
一、類檢視的定義和使用
在Django中還可以通過類來定義一個檢視,稱為類檢視。
定義一個類檢視:定義一個類,需繼承 Django 提供的 View
類 。
from django.views.generic import View class TestView(View): def get(self, request): """get請求""" return render(request, 'index.html') def post(self, request): """post請求""" # 程式碼略 return HttpResponse('操作結果')
路由配置:呼叫類檢視的 as_view()
方法
urlpatterns = [
...
url(r'^Test$', views.PostView.as_view()),
]
as_view()的作用是按照不同請求方式呼叫不同請求方法,詳情檢視 as_view() 方法原始碼,以及其內部呼叫的 dispatch()
二、類檢視繼承擴充套件類
定義的擴充套件父類名稱通常以Mixin結尾,類檢視可以直接通過多繼承,繼承他們的方法。
ListModelMixin
查詢多條資料(列表資料)CreateModelMixin
新增一條資料RetrieveModelMixin
查詢一條資料UpdateModelMixin
修改一條資料DestroyModelMixin
刪改一條資料
這些 Mixin 類分別提供了不同的類檢視方法{{TODO:後續補充詳情}})
class DepartmentView(CreateModelMixin, ListModelMixin, View): """ 同時繼承兩個擴充套件類 """ def get(self, request): # 複用父類ListModelMixin的list方法 return self.list(request) def post(self, request): # 複用父類CreateModelMixin的create方法 return self.create(request) class EmployeeView(CreateModelMixin, View): """ 繼承CreateModelMixin擴充套件類 """ def post(self, request): # 複用父類ListModelMixin的list方法 return self.create(request)
三、為檢視新增裝飾器
裝飾器:不在改變原有函式的前提下,在函式呼叫之前或之後執行額外的操作
1、準備一個裝飾器
def check_ip(view_fun):
"""裝飾器:禁止黑名單ip訪問"""
def wrapper(request, *args, **kwargs):
# 在檢視函式執行前做額外的操作:
# 禁止ip黑名單訪問
IP = request.META.get('REMOTE_ADDR')
if IP in ['192.168.210.160']:
return HttpResponse('IP禁止訪問')
return view_fun(request, *args, **kwargs)
return wrapper
2、不能直接使用我們上面的裝飾器(缺少self引數)
需要使用method_decorator 裝飾器,函式裝飾器補充第一個self引數,使它可以應用到類的方法中。
@method_decorator(check_ip)
3、給類檢視的特定的方法新增裝飾器
class PostView(View):
@method_decorator(check_ip)
def post(self, request):
return HttpResponse('處理髮帖操作')
4、給類檢視的所有方法應用裝飾器:
給 dispatch 方法加上@method_decorator(check_ip)
,就能給給類檢視的所有方法應用裝飾器:
class PostView(View):
@method_decorator(check_ip)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
5、另一種方式:
在類上面新增裝飾器,指定對哪個方法進行裝飾 :@method_decorator(裝飾器名, name='檢視方法名')
@method_decorator(check_ip, name='get')
class PostView(View):
def get(self, request):
return render(request, 'index.html')
def post(self, request):
return HttpResponse('操作結果')
四、Django中介軟體
一個輕量級、底層的外掛系統,用於在檢視函式呼叫之前或之後執行額外操作,在全域性上修改Django的輸入或輸出。
方法名 | 作用 | 返回值 |
---|---|---|
__init__(self, get_response=None) |
伺服器啟動(重啟)時執行一次 | 無 |
process_request(self, request) |
在檢視執行之前呼叫 | 返回 None : 會執行檢視;返回 HttpResponse : 不會再執行檢視 |
process_response(self, request, response) |
在檢視執行完之後呼叫 | 必須返回HttpResponse物件 |
1、定義中介軟體
通過繼承Django的MiddlewareMixin
擴充套件類實現
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print('before 檢視')
def process_response(self, request, response):
print('after 檢視')
return response # 必須要有返回值
process_request():可以返回None或者response物件,如果返回response物件,則檢視函式就不會再執行了
2、在settings檔案中配置
MIDDLEWARE = [
'middlewares.MyMiddleware', # 註冊中介軟體
]
3、多箇中間件的執行順序
- 對於檢視之前執行的 process_request 方法,先 註冊的中介軟體先執行
- 對於檢視之後執行的 process_response 方法,後 註冊的中介軟體先執行
要注意多箇中間件之間的依賴關係, 被依賴的中介軟體要宣告在前面