Названия ваших представлений должны быть уникальными, даже если они указывают на один и тот же метод просмотра.
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'])
Для пользователей, которые используют @ app.route, лучше использовать ключевой аргумент endpoint
, а не указывать значение __name__
, как указано Roei Bahumi . В качестве примера возьмем:
@app.route("/path1", endpoint='func1')
@exception_handler
def func1():
pass
@app.route("/path2", endpoint='func2')
@exception_handler
def func2():
pass
Флажок требует, чтобы вы связали одну «функцию просмотра» с «конечной точкой». Вы дважды вызываете 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"])
Существует исправление для проблемы с фляксом № 570, появившееся в последнее время (фляга 0.10), которая вызывает это исключение.
См. https://github.com/mitsuhiko/flask/issues / 796
Итак, если вы перейдете в flask / app.py и закомментируете 4 строки 948..951, это может помочь, пока проблема не будет полностью решена в новой версии.
Разница этого изменения находится здесь: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1
Эта же проблема возникает со мной, но с другим использованием. Когда я попытался обернуть функцию 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
Изменение имени функции, которая была решена для меня (wrapper.func_name = func.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.func_name = func.func_name
return wrapper
Затем было выполнено декорирование более чем одной конечной точки.
functools.wraps
для достижения функции переименования.
– ryannjohnson
2 April 2017 в 22:46
wrapper.__name__
вместо wrapper.func_name
. Возможно, это разница между python2 и python3?
– Resonance
30 January 2018 в 12:36
wrapper.__name__ = func.__name__
перед вызовом обертки решила проблему.
– Tom Wojcik
5 April 2018 в 09:46
Если вы считаете, что у вас уникальные имена конечных точек, и эта ошибка указана, вероятно, вы столкнулись с проблемой . То же самое было со мной.
Эта проблема связана с флягой 0.10, если у вас есть такая же версия, а затем выполните следующие действия, чтобы избавиться от этого:
sudo pip uninstall flask
sudo pip install flask=0.9
Я хотел бы добавить к этому более «типовое» решение.
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