Flask多文件API端点问题:如何让所有路由同时生效?
解决Flask拆分API端点到多文件的问题
你的问题出在两个核心点:
- 两个文件各自创建了独立的
Flask应用实例,没有共享同一个服务上下文 teste2.py中也调用了app.run(),当teste.py导入它时,这个启动命令会先执行并阻塞程序,导致teste.py自身的路由根本没机会加载
下面用Flask官方推荐的**Blueprint(蓝图)**方案实现模块化拆分,让所有端点正常工作:
修改teste2.py(转为蓝图模块)
将teste2.py改成蓝图形式,不再创建独立的Flask实例:
from flask import Blueprint, jsonify # 创建蓝图实例,命名为livros_bp livros_bp = Blueprint('livros_bp', __name__) livros2 = [ { 'id': 1, 'título': 'only a teste', 'autor': 'J.R.R Tolkien' }, ] # 使用蓝图的route装饰器定义路由 @livros_bp.route('/livross', methods=['GET']) def obter_livros(): return jsonify(livros2)
修改teste.py(主应用文件)
在主文件中导入蓝图并注册到主Flask实例,同时确保只有主文件启动服务:
from flask import Flask, jsonify, request # 导入teste2中的蓝图 from teste2 import livros_bp app = Flask(__name__) # 将蓝图注册到主应用 app.register_blueprint(livros_bp) livros = [ { 'id': 1, 'título': 'O Senhor dos Anéis - A Sociedade do Anel', 'autor': 'J.R.R Tolkien' }, { 'id': 2, 'título': 'Harry Potter e a Pedra Filosofal', 'autor': 'J.K Howling' }, { 'id': 3, 'título': 'James Clear', 'autor': 'Hábitos Atômicos' }, ] # 原有路由保持不变 @app.route('/livros', methods=['GET']) def obter_livros(): return jsonify(livros) @app.route('/livros/<int:id>', methods=['GET']) def obter_livro_por_id(id): for livro in livros: if livro.get('id') == id: return jsonify(livro) @app.route('/livros/<int:id>', methods=['PUT']) def editar_livro_por_id(id): livro_alterado = request.get_json() for indice, livro in enumerate(livros): if livro.get('id') == id: livros[indice].update(livro_alterado) return jsonify(livros[indice]) @app.route('/livros', methods=['POST']) def incluir_novo_livro(): novo_livro = request.get_json() livros.append(novo_livro) return jsonify(livros) @app.route('/livros/<int:id>', methods=['DELETE']) def excluir_livro(id): for indice, livro in enumerate(livros): if livro.get('id') == id: del livros[indice] return jsonify(livros) # 仅当直接运行该文件时才启动服务 if __name__ == '__main__': app.run(port=5000, host='localhost', debug=True)
验证效果
运行teste.py后,两个文件的端点都能正常访问:
/livros系列端点(来自teste.py)/livross端点(来自teste2.py)
内容的提问来源于stack exchange,提问作者Antharaz
相关产品推荐
相关产品推荐

