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

如何在Google Cloud Platform(GCP)中部署含多Flask子应用的项目?

GCP部署多Flask应用(内部调用)方案

你的本地方案依赖subprocess启动子进程、webbrowser打开页面,这类逻辑在GCP服务器环境完全不适用,以下是三种可行的部署方案,按推荐优先级排序:


方案1:拆分App Engine独立服务(推荐)

将每个Flask应用作为App Engine的独立服务,通过内部域名实现跨服务调用。

步骤1:调整代码与配置

  • 移除本地逻辑:删除subprocess和webbrowser相关代码,改用HTTP请求调用其他服务。示例:
    import requests
    
    # 主应用调用app1服务的示例代码
    def call_app1():
        try:
            # 同项目内可直接用服务名+内部域名调用
            response = requests.get("http://app1-dot-你的项目ID.appspot.com")
            return response.text
        except requests.exceptions.RequestException as e:
            return f"调用app1失败: {str(e)}"
    
  • 配置每个服务的app.yaml:
    • 主服务(根目录app.yaml):
      runtime: python39
      service: main
      handlers:
        - url: /.*
          script: auto
      
    • app1服务(app1/app.yaml):
      runtime: python39
      service: app1
      handlers:
        - url: /.*
          script: auto
      
    • app2服务同理,将service字段设为app2。
  • 统一依赖:根目录requirements.txt需包含所有应用的依赖(如flask、requests)。

步骤2:部署服务

分别执行部署命令:

# 部署主服务
gcloud app deploy main.py app.yaml

# 部署app1服务
gcloud app deploy app1/app.yaml

# 部署app2服务
gcloud app deploy app2/app.yaml

注意事项

  • 所有服务需在同一个GCP项目下,默认允许同项目服务间的内部HTTP调用。
  • 每个服务的端口由App Engine自动管理,无需手动指定。

方案2:单个App Engine服务内整合多应用

如果不想拆分服务,可将三个Flask实例整合到一个WSGI应用中,通过路由分发请求。

步骤1:修改主应用代码

在main.py中导入子应用的Flask实例,通过路由转发请求:

import os
from flask import Flask
from app1.app1 import app as app1
from app2.app2 import app as app2

main_app = Flask(__name__)

# 转发/app1/*路径到app1
@main_app.route('/app1/<path:path>')
def serve_app1(path):
    return app1.full_dispatch_request()

@main_app.route('/app1')
def serve_app1_root():
    return app1.full_dispatch_request()

# 同理转发/app2/*路径到app2
@main_app.route('/app2/<path:path>')
def serve_app2(path):
    return app2.full_dispatch_request()

@main_app.route('/app2')
def serve_app2_root():
    return app2.full_dispatch_request()

# 主应用自有路由
@main_app.route('/')
def home():
    # 内部调用子应用可直接调用其视图函数
    return f"主应用首页 | app1首页内容: {app1.view_functions['index']()}"

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    main_app.run(host='0.0.0.0', port=port)

步骤2:调整子应用代码

确保子应用的Flask实例仅在直接运行时启动服务,避免冲突:

# app1/app1.py示例
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "app1首页"

# 仅在本地直接运行时启动服务
if __name__ == '__main__':
    app.run(port=5000)

步骤3:部署单个服务

直接执行根目录部署命令:

gcloud app deploy

方案3:GKE容器化部署

若需更高灵活性(如自定义端口、资源配置),可将每个应用打包成Docker镜像,部署到Google Kubernetes Engine。

步骤1:编写Dockerfile

以app1为例,app1/Dockerfile内容:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app1.py .
COPY templates/ ./templates/
CMD ["python", "app1.py"]

步骤2:构建并推送镜像

# 构建app1镜像并推送到GCR
gcloud builds submit --tag gcr.io/你的项目ID/app1 ./app1

# 同理构建并推送app2和main应用的镜像

步骤3:部署到GKE

为每个应用创建Deployment和ClusterIP类型的Service,主应用通过Service的内部域名(如http://app1-service.default.svc.cluster.local)调用子应用。


通用注意事项

  • 端口适配:GCP环境会自动分配端口,所有Flask应用需读取环境变量PORT监听端口:
    port = int(os.environ.get('PORT', 8080))
    app.run(host='0.0.0.0', port=port)
    
  • 依赖检查:确保requirements.txt包含所有依赖包,避免部署时缺失。

内容的提问来源于stack exchange,提问作者Omkar Kabde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:55:32