CBV添加裝飾器
需要借助于一個專門的裝飾器模塊
from django.utils.decorators import method_decorator
方式1
直接在類中的某個方法上添加
class MyLoginView(views.View): @method_decorator(login_auth) def get(self, request): return HttpResponse("from CBV get view")
方式2
直接在類名上添加并指定
@method_decorator(login_auth, name='get') class MyLoginView(views.View): def get(self, request): return HttpResponse("from CBV get view")
方式3
重寫dispatch方法并添加作用于類中所有的方法
class MyLoginView(views.View): @method_decorator(login_auth) def dispatch(self, request, *args, **kwargs): super().dispatch(request,*args,**kwargs)
django中間件
概念
是django的門戶,自帶七個中間件,每個都有各自對應的功能,在settings.py中
自定義中間件
自定義方法
django不單有七個中間件并且每個都有很多功能和方法,除此之外django還支持自定義中間件并提供五個可以自定義的方法:
- process_request
- process_response
- process_view
- process_template_response
- process_excepton
使用場景
只要是全域相關的功能都可以在中間件中撰寫,比如戶黑名單校驗、用戶訪問頻率校驗、網站全域用戶身份校驗
自定義中間件步驟
- 創建一個任意名稱的檔案夾
- 在該檔案夾內創建一個任意名稱的py檔案
- 在該py檔案內撰寫中間件類
from django.utils.deprecation import MiddlewareMixin class MyMiddle1(MiddlewareMixin): def process_request(self, request): print('自定義中間件:from MyMiddle1 process_request') class MyMiddle2(MiddlewareMixin): def process_request(self, request): print('自定義中間件:from MyMiddle2 process_request')
- 組態檔中注冊
'app01.mymiddleware.mymiddle.MyMiddle1', 'app01.mymiddleware.mymiddle.MyMiddle2'
自定義中間件方法
process_request
請求來的時候會從上往下依次執行組態檔中注冊了的中間件里面的process_request方法,如果沒有則直接跳過

如果該方法自己回傳了HttpResponse物件,那么請求不再繼續往后直接回傳相應的資料

process_response
回應走的時候會從下往上依次執行組態檔中注冊了的中間件里面的process_response方法,如果沒有則直接跳過

如果該方法自己回傳了HttpResponse物件,那么回應會替換成該HttpResponse物件資料,而不再是視圖函式想要回傳給客戶端的資料
注意
如果process_request回傳了HttpResponse物件 那么會從當前位置從下往上執行每一個process_response
process_view
路由匹配成功之后執行視圖之前從上往下執行組態檔中注冊了的中間件里面的process_view方法

process_template_response
視圖函式執行完畢之后回傳的物件中含有render屬性對應一個render方法則會從下往上執行組態檔中注冊了的中間件里面的process_template_response方法

process_exception
視圖函式執行程序中報錯并在回傳回應的時候會從下往上執行組態檔中注冊了的中間件里的process_exception方法

基于中間件思想撰寫專案
importlib模塊
可以通過字串的形式匯入模塊
常規匯入方式
from ccc import b print(b) # <module 'ccc.b' from '/Users/jiboyuan/PycharmProjects/day61_1/ccc/b.py'> print(b.name)
字串匯入方式
import importlib module_path = 'ccc.b' res = importlib.import_module(module_path) print(res.name)
注意
mport importlib module_path = 'ccc.b.name' importlib.import_module(module_path) # 不可以
importlib模塊最小匯入單位是模塊檔案級別
以發送提示資訊為需求撰寫功能
方式1:封裝成函式
notify.py def send_email(msg): print('郵箱資訊提示:%s' % msg) def send_msg(msg): print('短信資訊提示:%s' % msg) def send_qq(msg): print('QQ資訊提示:%s' % msg) def send_all(msg): send_email(msg) send_msg(msg) send_qq(msg)
start.py from notify import send_all send_all('hello world') 郵箱資訊提示:hello world 短信資訊提示:hello world QQ資訊提示:hello world
方式2:封裝成配置
emsil.py class Email(object): def __init__(self): pass def send(self, msg): print('郵箱資訊提示:%s' % msg) msg.py class Msg(object): def __init__(self): pass def send(self, msg): print('短信資訊提示:%s' % msg) qq.py class QQ(object): def __init__(self): pass def send(self, msg): print('QQ資訊提示:%s' % msg)
settings.py NOTIFY_FUNC_LIST = [ 'notify.email.Email', 'notify.msg.Msg', 'notify.qq.QQ' ]
__init__.py import settings import importlib def send_all(msg): # 1.回圈獲取組態檔中字串資訊 for str_path in settings.NOTIFY_FUNC_LIST: # 'notify.email.Email' # 2.切割路徑資訊 module_path, class_str_name = str_path.rsplit('.', maxsplit=1) # ['notify.email','Email'] # 3.根據module_path匯入模塊檔案 module = importlib.import_module(module_path) # 4.利用反射獲取模塊檔案中對應的類名 class_name = getattr(module, class_str_name) # Email Msg QQ # 5.實體化 obj = class_name() # 6.呼叫發送訊息的功能 obj.send(msg)
start.py import notify if __name__ == '__main__': notify.send_all(msg)
如果還需要取消其中某個功能,直接在組態檔注釋功能的這一行即可
增加功能參考以上代碼

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481429.html
標籤:Python
上一篇:爬蟲代理 IP 池及隧道代理(2022.05.24)
下一篇:撰寫一個for回圈,創建5個隨機生成的長度分別為100,200,500,800和1000的資料幀,并列印每個資料幀

