发布于 5年前

解决python flask报错:AssertionError: View function mapping is overwriting an existing endpoint function: main

在使用flask报错:

AssertionError: View function mapping is overwriting an existing endpoint function: exception_handler

首先要检查是否在不同的的路由里使用了相同的endpoint函数。

定义路由代码:

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

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

此次错误的原因是使用了wrapper来包装api函数,如下:

def exception_handler(func):
  def wrapper(*args, **kwargs):
    try:
        return func(*args, **kwargs)
    except Exception as e:
        error_code = getattr(e, "code", 500)
        r = dict_to_json({"message": e.message, "error_code": error_code})
        return Response(r, status=error_code, mimetype='application/json')
  return wrapper

解决方法

方法一:

重命名wrapper的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)
        r = dict_to_json({"message": e.message, "error_code": error_code})
        return Response(r, status=error_code, mimetype='application/json')
  #此处重命名了func_name
  wrapper.func_name = func.func_name
  return wrapper

方法二:

除了使用wrapper包装api函数外,也可以在@app.route设置endpoint名,以避免出现重名的endpoint 函数:

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

@app.route("/path2", endpoint='func2')
@exception_handler
def func2():
    pass
©2020 edoou.com   京ICP备16001874号-3