You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask多文件API端点问题:如何让所有路由同时生效?

解决Flask拆分API端点到多文件的问题

你的问题出在两个核心点:

  1. 两个文件各自创建了独立的Flask应用实例,没有共享同一个服务上下文
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:50:36