:昨天聊了一下構造。今天試了一下。感覺昨天聊的還是不夠細化。今天結合代碼實現,加以一點補充。
首先觀察下面這個例子
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')
顯然這樣調整以后,達到了我們需要的效果。此外,測試了一下改動(裝飾器以及目標函數)形式參數的順序,結果不會發生變化
(但是注意:return f(object_id,sys_id,*args, **kwargs)的內容,這里沒有將形參和實參綁定,因此可見裝飾器實際上修改了傳遞參數的順序。所以要注意代碼規范,善用變化)
這個地方成功將參數和傳遞進入的形參進行了綁定。這樣的話,我們就可以成功在以下這種動態路由寫法的時候驗證傳遞給目標函數的地址,
當前用戶是否具有訪問權限了
但這樣還不夠,當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()進行動態構建,應該也能滿足這個要求。
不過這樣的編程方式,我感覺還是不太理想。后面找時間再優化看看。