117 votes

AssertionError : Le mappage de la fonction de visualisation écrase une fonction de point de terminaison existante : main

Quelqu'un sait-il pourquoi je ne peux pas écraser une fonction de point de terminaison existante si j'ai deux règles url comme ceci

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 :

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

171voto

Roei Bahumi Points 361

Ce même problème m'est arrivé lorsque j'avais plus d'une fonction API dans le module et que j'ai essayé d'envelopper chaque fonction avec deux décorateurs :

  1. @app.route()
  2. Mon décorateur @exception_handler personnalisé

J'ai eu cette même exception parce que j'ai essayé d'envelopper plus d'une fonction avec ces deux décorateurs :

@app.route("/path1")
@exception_handler
def func1():
    pass

@app.route("/path2")
@exception_handler
def func2():
    pass

Plus précisément, il est causé par la tentative d'enregistrement de quelques fonctions portant le nom de emballage :

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

Changer le nom de la fonction a résolu le problème pour moi ( 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

Ensuite, la décoration de plus d'un point d'accès a fonctionné.

72voto

Michael Davis Points 1234

Vos noms de vue doivent être uniques, même s'ils pointent vers la même méthode de vue.

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'])

37voto

Uri Shalit Points 1160

Pour les utilisateurs qui utilisent @app.route, il est préférable d'utiliser l'argument-clé endpoint plutôt que de changer la valeur de __name__ comme Roei Bahumi déclaré. Son exemple sera suivi :

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

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

10voto

dtheodor Points 1383

Flask vous demande d'associer une seule "fonction de vue" à un "point de terminaison". Vous appelez Main.as_view('main') deux fois, ce qui crée deux fonctions différentes (exactement la même fonctionnalité mais une signature mémoire différente). En bref, vous devriez simplement faire

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"])

9voto

Joseph Points 137

Cela peut également se produire lorsque vous avez des noms de fonctions identiques sur différentes routes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X