我有一个带有几个端点的烧瓶应用程序,我已经写了一个装饰器来记录端点以供审核。当我尝试使用一个端点时装饰器工作正常,但是当我将装饰器添加到第二个端点时,我面临断言错误
例如,我有两个要编辑和删除的端点
@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
从错误消息中,我得到的名称必须是唯一的,如方法名称,但我怎么能在装饰器中做到这一点?
任何建议都会有所帮助
答案 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