【问题标题】:Decorator - viewpoint mapping assertion error装饰器 - 视点映射断言错误
【发布时间】:2017-05-02 09:17:39
【问题描述】:

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

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

@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

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

任何建议都会有所帮助

【问题讨论】:

    标签: python flask decorator python-decorators


    【解决方案1】:

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

    (...) 装饰器是一个返回函数的函数。在实现这样的事情时,唯一需要记住的是更新函数的 __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
    

    【讨论】:

    • 是的,我想通了,并将其添加到代码中 wrap.__name__ = func.func_name 解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多