前面我們已經實現了路由列表,但是每次新增路由都需要手動新增來完成,接下來我們想要完成路由的自動新增,可以通過裝飾器來實現,在使用裝飾器對處理函式進行裝飾的時候我們需要知道裝飾的函式和那個請求路徑進行關聯,也就是說裝飾器需要接收乙個url引數,這樣我們定義的裝飾器是乙個帶有引數的裝飾器。
framework.py 示例**:
""
"miniweb框架,負責處理動態資源請求"
""import time
# 定義路由列表
route_list =
# 定義帶有引數的裝飾器
def route
(path)
: # 裝飾器
def decorator
(func)
: # 當執行裝飾器裝飾指定函式的時候,把路徑和函式新增到路由列表
route_list.
((path, func)
) def inner()
: # 執行指定函式
return
func()
return inner
# 返回裝飾器
return decorator
# 獲取首頁資料
@route
("/index.html"
)def index()
: # 響應狀態
status =
"200 ok"
; # 響應頭
response_header =[(
"server"
,"pws2.0")]
# 開啟模板檔案,讀取資料
with open
("template/index.html"
,"r"
) as file:
file_data = file.
read()
# 處理後的資料, 從資料庫查詢
data = time.
ctime()
# 替換模板檔案中的模板遍歷
result = file_data.
replace(""
, data)
return status, response_header, result
# 獲取個人中心資料
@route
("/center.html"
)def center()
: # 響應狀態
status =
"200 ok"
; # 響應頭
response_header =[(
"server"
,"pws2.0")]
# 開啟模板檔案,讀取資料
with open
("template/center.html"
,"r"
) as file:
file_data = file.
read()
# 處理後的資料, 從資料庫查詢
data = time.
ctime()
# 替換模板檔案中的模板遍歷
result = file_data.
replace(""
, data)
return status, response_header, result
# 沒有找到動態資源
def not_found()
: # 響應狀態
status =
"404 not found"
; # 響應頭
response_header =[(
"server"
,"pws2.0")]
# 處理後的資料
data =
"not found"
return status, response_header, data
# 處理動態資源請求
def handle_request
(env)
: # 獲取動態請求資源路徑
request_path = env[
"request_path"
]print
("接收到的動態資源請求:"
, request_path)
# 遍歷路由列表,選擇執行的函式
for path, func in route_list:
if request_path == path:
result =
func()
return result
else
: # 沒有找到動態資源
result =
not_found()
return result
使用帶有引數的裝飾器對處理函式進行裝飾,並完成路由的新增功能。 mini web框架 裝飾器 總結1 5 3 1)
原則 開放封閉 可以擴充套件,但是不可以修改。也就是說軟體對擴充套件開放,對修改關閉。運用技術 閉包 一共兩種方法,乙個使用閉包,乙個使用類 使用多個裝飾器是從上到下 def test2 func def return num,args,kwargs print test2 print 附加 d n...
裝飾器之適配裝飾器
可能沒人發現,前面描述的裝飾器受眾面太小了 都是只能知道原函式入參個數的情況下才能編寫裝飾器,所以寫出來的裝飾器都只能針對入參個數的函式使用 不侷限於原函式 def godme fun def godme message print before fun message print after re...
裝飾器模式之抽象裝飾器的作用
今天要搞清楚的問題是為什麼需要上面那個被黃色框圈住的 抽象裝飾器類 裝飾器模式實現了不破壞原有類的情況下動態擴充套件乙個類的功能。為什麼需要抽象裝飾器類 搞清楚這個問題最好的辦法是手寫乙個裝飾器模式,然後去掉中間的抽象裝飾器類,看看會發生什麼。下面根據最上面的uml圖寫一下 頂層介面 public ...