2016-12-16 16 views
0

我有許多端點的瓶子應用程序,並且我打算編寫一個裝飾器來記錄API端點的動作。裝飾器將參數作爲KWARGS傳遞,但需要位於瓶頸中的位置參數API端點

例如,我有一個終點,如下刪除條目API調用http://localhost:5000/api/owners/123/delete

@route('/owners/<ownerid>/delete',methods=['DELETE']) 
def deleteOwner(ownerid): 
    if request.method == 'DELETE': 
     """ delete action """ 
     return jsonify({}) 

現在我想一個裝飾添加到該調用,這樣它會記錄用戶操作。所以我有一個裝飾嘗試如下

def logtrail(func): 
    def wrap(*args, **kwargs): 
     print args 
     print kwargs.values() #This prints {"ownerid":"123"} 
     return func(kwargs) 
    return wrap 

現在裝修如下

@route('/owners/<ownerid>/delete',methods=['DELETE']) 
@logtrail 
def deleteOwner(ownerid): 
    if request.method == 'DELETE': 
     """ delete action """ 
     return jsonify({}) 

當我裝修我原來的API方法與@logtrail的「OWNERID」我需要一個位置參數作爲{「ownerid」:「123」}傳遞給裝飾器函數。

我是新來的裝飾,並需要一些幫助如何解決這個問題。

+2

你怎麼寫你的裝飾爲您簡單的實施將打破反省並可能導致其他的問題是小心。您可能需要考慮查看諸如「wrapt」之類的裝飾模塊,該模塊使用技巧來確保您的裝飾器正常工作。請參閱http://wrapt.readthedocs.io/en/latest/閱讀博客文章,瞭解可能出現的問題。 –

回答

1

該問題與如何在python上傳遞變量工作/參數有關。 要修復它,只需將return func(kwargs)更改爲return func(**kwargs),因此kwargs將作爲關鍵字而不是字典傳遞。

def logtrail(func): 
    def wrap(*args, **kwargs): 
     print args 
     print kwargs.values() #This prints {"ownerid":"123"} 
     return func(**kwargs) 
    return wrap 
相關問題