Кто-нибудь знает, почему я могу'т заменить существующую функцию конечной точки, если у меня есть два правила 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
Такая же проблема случилось со мной, когда у меня было больше чем одна функция API в модуле и попытался обернуть каждую функцию с 2 декораторов:
У меня такое же исключение, потому что я пытался обернуть более чем одна функция с этими двумя декораторов:
@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
Изменение имени функции решено для меня (фантик.имя = кнопку func.имя):
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
Затем, украшать более одной конечной точки работали.
Ваши имена должны быть уникальными, даже если они указывают на один и тот же метод просмотра.
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'])
Для пользователей, которые используют @приложение.маршрут лучше использовать ключ-аргумент конечная точка
, а затем чейнинга значение __имя__
Рой Bahumi заявил. Принимая его пример будет:
@app.route("/path1", endpoint='func1')
@exception_handler
def func1():
pass
@app.route("/path2", endpoint='func2')
@exception_handler
def func2():
pass
Колбу необходимо связать один 'функция просмотра' с 'конечная'. Вы вызываете главное.as_view('главная')` два раза, что создает две различные функции (точно такие же функции, но разных в подписи память). Короткий рассказ, вы должны просто делать
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"])
Я просто хотел бы добавить к этому еще 'шаблон#39; тип решение.
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
Есть исправление для выпуска фляга #570 ввели не так давно (фляжка 0.10), что вызывает это исключение будет поднят.
См https://github.com/mitsuhiko/flask/issues/796
Так что если вы идете в flask/app.py и закомментировать 4 строки..948 951, это может помочь, пока проблема не будет resovled полностью в новой редакции.
Разница в том, что перемены-это здесь: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1
Ваши имена должны быть уникальными, даже если они указывают на один и тот же метод просмотра, или вы можете добавить из functools импорт обертывания и использовать @обертывания https://docs.python.org/2/library/functools.html
использовать вместо фляга 0.9
используйте следующие команды
судо пункт Удалить фляжка
sudo pip install flask==0.9