Flask 中 AssertionError: View function mapping is overwriting an existing endpoint function: decorate

在Flask中,在多个视图方法上使用装饰器decorate会造成 AssertionError: View function mapping is overwriting an existing endpoint function: decorate。

原因:

视图方法会添加一条 url rule,其中方法名会被使用。

# Basically this example::   
 
@app.route('/')    
def index():        
    pass

# Is equivalent to the following::    

def index():        
    pass    
app.add_url_rule('/', 'index', index)

# If the view_func is not provided you will need to connect the endpointto a view function like so::    

app.view_functions['index'] = index


而在Flask中视图名称必须是唯一的!


使用装饰器时名称会被返回的函数替换

def wrap(func):
    def derocate():
        func()
    return derocate


@wrap
def pt():
    print('pt', __name__)


@wrap
def p2():
    print('p2', __name__, '1234')


print(pt.__name__)
print(p2.__name__)

# 结果
derocate
derocate


解决办法很简单,使用 functools.wraps()

import functools

def wrap(func):
    @functools.wraps(func)
    def derocate():
        func()
    return derocate


@wrap
def pt():
    print('pt', __name__)


@wrap
def p2():
    print('p2', __name__, '1234')


print(pt.__name__)
print(p2.__name__)

# 结果
pt
p2



总结:

在 Flask 中视图方法上使用装饰器,一个是没有问题的,多少会有同名问题。

使用装饰器时始终使用 functools.wraps()。

展开阅读全文