AssertionError: просмотр отображение функция перезаписи функция конечной точкой: главная

Кто-нибудь знает, почему я могу'т заменить существующую функцию конечной точки, если у меня есть два правила 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
Комментарии к вопросу (5)

Такая же проблема случилось со мной, когда у меня было больше чем одна функция API в модуле и попытался обернуть каждую функцию с 2 декораторов:

  1. @приложения.маршрута()
  2. Мой заказ @exception_handler оформитель

У меня такое же исключение, потому что я пытался обернуть более чем одна функция с этими двумя декораторов:

@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

Затем, украшать более одной конечной точки работали.

Комментарии (3)
Решение

Ваши имена должны быть уникальными, даже если они указывают на один и тот же метод просмотра.

app.add_url_rule('/',
                 view_func=Main.as_view('main'),
                 methods = ['GET'])

app.add_url_rule('//',
                 view_func=Main.as_view('page'),
                 methods = ['GET'])
Комментарии (0)

Для пользователей, которые используют @приложение.маршрут лучше использовать ключ-аргумент конечная точка, а затем чейнинга значение __имя__ Рой Bahumi заявил. Принимая его пример будет:

@app.route("/path1", endpoint='func1')
@exception_handler
def func1():
    pass

@app.route("/path2", endpoint='func2')
@exception_handler
def func2():
    pass
Комментарии (0)

Колбу необходимо связать один 'функция просмотра' с 'конечная'. Вы вызываете главное.as_view('главная')` два раза, что создает две различные функции (точно такие же функции, но разных в подписи память). Короткий рассказ, вы должны просто делать

main_view_func = Main.as_view('main')

app.add_url_rule('/',
             view_func=main_view_func,
             methods=["GET"])

app.add_url_rule('//',
             view_func=main_view_func,
             methods=["GET"])
Комментарии (0)

Я просто хотел бы добавить к этому еще 'шаблон#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)

Если вы считаете, что у вас есть уникальные имена конечной точки и все равно эта ошибка выдается тогда, вероятно, вы столкнулись с Вопрос. То же самое было в случае со мной.

Эта проблема с колбой 0.10 в случае, если у вас одинаковая версия, то сделать следующее, Чтобы избавиться от этого:

sudo pip uninstall flask
sudo pip install flask=0.9
Комментарии (0)

Есть исправление для выпуска фляга #570 ввели не так давно (фляжка 0.10), что вызывает это исключение будет поднят.

См https://github.com/mitsuhiko/flask/issues/796

Так что если вы идете в flask/app.py и закомментировать 4 строки..948 951, это может помочь, пока проблема не будет resovled полностью в новой редакции.

Разница в том, что перемены-это здесь: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1

Комментарии (1)

Ваши имена должны быть уникальными, даже если они указывают на один и тот же метод просмотра, или вы можете добавить из functools импорт обертывания и использовать @обертывания https://docs.python.org/2/library/functools.html

Комментарии (0)

использовать вместо фляга 0.9 используйте следующие команды судо пункт Удалить фляжка

sudo pip install flask==0.9
Комментарии (0)

Это может произойти также, когда у вас одинаковые имена функций на разных маршрутах.

Комментарии (0)