2016-12-16 6 views
0

У меня есть флеш-приложение с несколькими конечными точками, и я написал декоратора для регистрации конечных точек для целей аудита. Декоратор работает отлично, когда я попытался с одной конечной точкой, но когда я добавить декоратор второй конечной точки, я столкнулся ошибка утвержденияDecorator - ошибка утверждения отображения точки зрения

Для примера, у меня есть две конечных точек для редактирования и удаления

@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 

С сообщением об ошибке, я получаю имя должно быть уникальным, как имена методов, но как я могу это сделать в декоратора?

Любое предложение будет полезно

ответ

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 
+1

Да понял, что, и добавил это к коду оберткой .__ name__ = func.func_name, который решал мой вопрос – slysid