:昨天聊了一下構造。今天試了一下。感受昨天聊的仍是不夠細化。今天結合代碼實現,加以一點補充。python
首先觀察下面這個例子編程
from functools import wraps
def decorator(f):
@wraps(f)
def decorated_function(object_id,*args, **kwargs):
print(object_id)
return f(object_id,*args, **kwargs)
return decorated_function
@decorator
def test(sys_id,object_id):
print("sys id is ",sys_id)
print("obj id is ", object_id)
test('bbbb','aaa')
這個例子的目的是爲了處理test的形參。假如已經知道test具備一個object_id屬性。但願在裝飾器中進行驗證。那麼按照上述寫法函數
獲得的結果和預期結果不符。由於實際上這個地方形參沒有按照名稱進行參數傳遞。而是隻是按照順序取了第一個輸入的參數'bbbb'做爲輸出測試
那麼接下來,根據python的尿性,我感受只要在輸入的時候指定一下輸入參數對應的形參類型,這個問題就能解決了。因而:優化
from functools import wraps
def decorator(f):
@wraps(f)
def decorated_function(object_id,sys_id,*args, **kwargs):
print(object_id)
return f(object_id,sys_id,*args, **kwargs)
return decorated_function
@decorator
def test(sys_id,object_id):
print("sys id is ",sys_id)
print("obj id is ", object_id)
test(sys_id='aaa',object_id='bbbb')
顯然這樣調整之後,達到了咱們須要的效果。此外,測試了一下改動(裝飾器以及目標函數)形式參數的順序,結果不會發生變化3d
(可是注意:return f(object_id,sys_id,*args, **kwargs)的內容,這裏沒有將形參和實參綁定,所以可見裝飾器實際上修改了傳遞參數的順序。因此要注意代碼規範,善用變化)代碼規範
這個地方成功將參數和傳遞進入的形參進行了綁定。這樣的話,咱們就能夠成功在如下這種動態路由寫法的時候驗證傳遞給目標函數的地址,blog
當前用戶是否具備訪問權限了繼承
但這樣還不夠,當URL中帶有get請求的參數的時候,就不能用傳遞的形參來進行處理了。由於get請求不會把參數放在函數的形參裏面。而是做爲get方法的返回值路由
那麼接下來測試一下:
裝飾器代碼以下:
def test(f):
@wraps(f)
def decorated_function(*args, **kwargs):
sys_id = request.args.get('sys_id')
print("sys_id is ",sys_id)
object_id = request.args.get('object_id')
print("object_id is ",object_id)
return f(*args, **kwargs)
return decorated_function
綁定該裝飾器的函數以下:
輸出結果:
那麼,經過嘗試獲得了這樣一些信息:裝飾器參數規則保持和目標函數一致時,能夠徹底繼承該路由的規則,只要在設置驗證類函數的時候,已知驗證項的名稱,就能直接使用
這個名稱進行驗證。若是這個名稱是動態生成的,那麼使用globals()進行動態構建,應該也能知足這個要求。
不過這樣的編程方式,我感受仍是不太理想。後面找時間再優化看看。