Кто-нибудь знает, почему я не могу перезаписать существующую функцию конечной точки, если у меня есть два таких правила URL-адреса
app.add_url_rule('/',
view_func=Main.as_view('main'),
methods=["GET"])
app.add_url_rule('/<page>/',
view_func=Main.as_view('main'),
methods=["GET"])
Выслеживать:
Traceback (most recent call last):
File "demo.py", line 20, in <module> methods=["GET"])
File ".../python2.6/site-packages/flask/app.py",
line 62, in wrapper_func return f(self, *args, **kwargs)
File ".../python2.6/site-packages/flask/app.py",
line 984, in add_url_rule 'existing endpoint function: %s' % endpoint)
AssertionError: View function mapping is overwriting an existing endpoint
function: main
Ответы:
Имена ваших представлений должны быть уникальными, даже если они указывают на один и тот же метод представления.
app.add_url_rule('/', view_func=Main.as_view('main'), methods = ['GET']) app.add_url_rule('/<page>/', view_func=Main.as_view('page'), methods = ['GET'])
источник
.as_view($VIEW_NAME)
вызове метода должен быть передан как уникальное имя строки.Та же проблема случилась со мной, когда у меня было более одной функции API в модуле и я пытался обернуть каждую функцию двумя декораторами:
У меня такое же исключение, потому что я пытался обернуть этими двумя декораторами несколько функций:
@app.route("/path1") @exception_handler def func1(): pass @app.route("/path2") @exception_handler def func2(): pass
В частности, это вызвано попыткой зарегистрировать несколько функций с помощью оболочки имени :
def exception_handler(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: error_code = getattr(e, "code", 500) logger.exception("Service exception: %s", e) r = dict_to_json({"message": e.message, "matches": e.message, "error_code": error_code}) return Response(r, status=error_code, mimetype='application/json') return wrapper
Для меня это решило изменение имени функции ( wrapper .__ name__ = func .__ name__ ):
def exception_handler(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: error_code = getattr(e, "code", 500) logger.exception("Service exception: %s", e) r = dict_to_json({"message": e.message, "matches": e.message, "error_code": error_code}) return Response(r, status=error_code, mimetype='application/json') # Renaming the function name: wrapper.__name__ = func.__name__ return wrapper
Затем сработало оформление более чем одной конечной точки.
источник
functools.wraps
для достижения переименования функции.wrapper.__name__
вместоwrapper.func_name
. Может, в этом разница между python2 и python3?wrapper.__name__ = func.__name__
перед вызовом обертки решил проблему.Для пользователей, которые используют @ app.route, лучше использовать ключ-аргумент,
endpoint
а не изменять значение,__name__
как заявил Рой Бахуми . Взять его пример будет:@app.route("/path1", endpoint='func1') @exception_handler def func1(): pass @app.route("/path2", endpoint='func2') @exception_handler def func2(): pass
источник
Flask требует, чтобы вы связали одну «функцию просмотра» с «конечной точкой». Вы вызываете
Main.as_view('main')
дважды, что создает две разные функции (точно такие же функции, но разные по сигнатуре памяти). Короткий рассказ, вам просто нужно сделатьmain_view_func = Main.as_view('main') app.add_url_rule('/', view_func=main_view_func, methods=["GET"]) app.add_url_rule('/<page>/', view_func=main_view_func, methods=["GET"])
источник
Я просто хотел бы добавить к этому более «шаблонное» решение.
def func_name(f): def wrap(*args, **kwargs): if condition: pass else: whatever you want return f(*args, **kwargs) wrap.__name__ = f.__name__ return wrap
просто хотел бы добавить действительно интересную статью «Разоблачение декораторов», которую я недавно нашел: https://sumit-ghosh.com/articles/demystifying-decorators-python/
источник
Это также может произойти, если у вас одинаковые имена функций на разных маршрутах.
источник
Если вы думаете, что у вас есть уникальные имена конечных точек, но по-прежнему выдается эта ошибка, возможно, вы столкнулись с проблемой . Так было и со мной.
Эта проблема связана с колбой 0.10, если у вас такая же версия, выполните следующие действия, чтобы избавиться от нее:
sudo pip uninstall flask sudo pip install flask=0.9
источник
Недавно появилось исправление проблемы Flask # 570 (flask 0.10), из-за которой возникает это исключение.
Увидеть Https://github.com/mitsuhiko/flask/issues/796.
Поэтому, если вы перейдете к flask / app.py и закомментируете 4 строки 948..951, это может помочь, пока проблема не будет полностью решена в новой версии.
Разница этого изменения здесь: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1
источник
Имена ваших представлений должны быть уникальными, даже если они указывают на один и тот же метод представления, или вы можете добавить обертки импорта из functools и использовать @wraps https://docs.python.org/2/library/functools.html
источник
используйте flask 0.9 вместо этого используйте следующие команды
sudo pip uninstall flask
sudo pip install flask==0.9
источник
Добавление
@wraps(f)
выше функции оболочки решило мою проблему.def list_ownership(f): @wraps(f) def decorator(*args,**kwargs): return f(args,kwargs) return decorator
источник