装饰器 - 视点映射断言错误

时间:2016-12-16 14:37:55

标签: python flask decorator python-decorators

我有一个带有几个端点的烧瓶应用程序,我已经写了一个装饰器来记录端点以供审核。当我尝试使用一个端点时装饰器工作正常,但是当我将装饰器添加到第二个端点时,我面临断言错误

例如,我有两个要编辑和删除的端点

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

@route('/owners/<ownerid>/edit',methods=['PUT'])
@logtrail()
def editOwner(ownerid):
     if request.method == 'PUT':
         return jsonify({})

装饰器@logtrail可以正常编辑或删除编辑点,但如果将装饰器添加到两个端点,应用程序无法启动

装饰者代码如下

def logtrail(usermsg=None):
    def decorator(func):
        def wrap(*args, **kwargs):
            print "Audit code goes here"
            return func(**kwargs)
        return wrap
    return decorator

启动应用程序时得到的确切错误是

AssertionError: View function mapping is overwriting an existing endpoint function: wrap

从错误消息中,我得到的名称必须是唯一的,如方法名称,但我怎么能在装饰器中做到这一点?

任何建议都会有所帮助

1 个答案:

答案 0 :(得分:2)

使用没有换行的装饰器将重命名该函数,这将导致您提到的问题 - 因为将有多个具有相同名称的函数。

  

(...)装饰器是一个返回函数的函数。在实现这样的事情时,你唯一要记住的是更新__name __,__ module__和函数的其他一些属性。这经常被遗忘,但是您不必手动执行此操作,有一个函数可以像装饰器一样使用(functools.wraps())。

http://flask.pocoo.org/docs/0.11/patterns/viewdecorators/)。

尝试将装饰器更改为以下内容:

from functools import wraps

def logtrail(usermsg=None):
    def decorator(func):
        @wraps(func)
        def wrap(*args, **kwargs):
            print "Audit code goes here"
            return func(**kwargs)
        return wrap
    return decorator