装饰器将参数传递为KWARGS但需要在flask API端点中使用位置参数

时间:2016-12-16 12:24:27

标签: python flask decorator python-decorators

我有一个带有许多端点的烧瓶应用程序,我计划编写一个装饰器来记录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({})

当我用@logtrail装饰我的原始API方法时,&#34; ownerid&#34;我需要作为位置参数作为{&#34; ownerid&#34;:&#34; 123&#34;}传递给装饰器函数。

我是装饰员的新手,需要一些帮助来解决这个问题。

1 个答案:

答案 0 :(得分:1)

问题与变量如何在python上传递/参数有关。 要解决此问题,只需将return func(kwargs)更改为return func(**kwargs),这样kwargs就会作为关键字而非dict传递。

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