Flask报AssertionError提示端点blogs.wrapper被覆写但无主动覆写行为求解决
报错核心成因
这个报错不是主动编写了重名视图函数导致的,根因是**flask_jwt_extended 的 jwt_required 装饰器使用时遗漏了调用括号**。jwt_required 本质是需要先执行、生成实际装饰器的工厂函数,如果直接写不带括号的 @jwt_required,会把被装饰的视图函数直接传入这个工厂函数,工厂内部返回的鉴权包装函数统一命名为 wrapper。
Flask 注册路由时会自动用被装饰函数的名字作为端点标识,当前代码里有3个接口(create_blog、update_blog、delete_blog)都用了不带括号的 @jwt_required,最终这3个接口注册时对应的函数名都是 wrapper,自然会触发“视图映射覆写现有端点函数: blogs.wrapper”的断言错误,报错里的blogs.wrapper就是这个统一命名的包装函数。
具体修复操作
- 修正所有
@jwt_required的使用写法,全部补充调用括号,改成@jwt_required()。这一步就能解决核心的端点覆写报错。 - 补全代码里遗漏的依赖导入:当前代码缺少
Blueprint、request、Blog模型、Tag模型的导入,补上后才能正常运行。 - 修正几个隐蔽的运行时问题:
- 遍历博客查询结果时,
blog.serialize如果是实例方法需要加调用括号,否则会把方法对象而非序列化结果存入列表 delete_blog接口返回的状态码写的是20,修正为标准的200- 冗余的
getattr(new_blog, "id")可以直接替换为更简洁的new_blog.id
- 遍历博客查询结果时,
修复后的正确装饰器示例
# 触发报错的错误写法 @blogs.route("/add_blog", methods=["POST"]) @jwt_required # 未加括号,导致所有被装饰的视图共享同一个wrapper函数名 def create_blog(): data = request.get_json() # ... 业务逻辑 # 修复后的正确写法 @blogs.route("/add_blog", methods=["POST"]) @jwt_required() # 正确调用生成专属装饰器,不会出现函数名冲突 def create_blog(): data = request.get_json() # ... 业务逻辑
内容的提问来源于stack exchange,提问作者ItsD3n1s
相关产品推荐
相关产品推荐

