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

部署在Heroku上的Python客户端-服务端应用:客户端如何与服务端通信?

部署Dash+FastAPI机器学习项目的架构选择问题

我有一个机器学习项目,可根据用户输入的参数预测收入:用Dash构建带表单的前端页面收集用户数据,FastAPI负责所有计算与预测工作。

流程逻辑是:用户填写表单后点击提交,请求发送到FastAPI完成预测,最终在当前页面无跳转展示结果及SHAP图表。本地环境中,通过以下代码调用接口可正常运行:

response = requests.get(
    'http://127.0.0.1:8000/predict_induvidual_income/',
    params={
        'age': age_input, 
        'workclass': workclass_input, 
        'education': education_input,
        'marital_status': marital_satus_input,
        'occupation': occupation_input,
        'relationship': relationschip_input,
        'ethnic_group': ethnic_group_input,
        'sex': sex_input,
        'country': country_input,
        'capital_gain': capital_gain_input,
        'capital_loss': capital_loss_input,
        'hours_per_week': hpw_input
    }
)

现在要将项目部署到Heroku(或其他平台),遇到了架构选择的问题:

  • 方案一:拆分为两个独立的Heroku项目,前端项目对应https://my-client.herokuapp.com/(负责表单展示与提交),后端项目对应https://my-server.herokuapp.com/(负责计算),同时将前端的请求地址替换为后端的Heroku链接
  • 方案二:使用单一Heroku链接,同时承载前端表单展示和后台计算逻辑

为简化问题,我用一个两数相加的示例来类比:用户输入两个数字,点击提交后请求后端,后端返回含sum键的JSON结果。

Dash前端示例代码

import dash
from dash.dependencies import Input, Output, State
from dash import html, dcc
import dash_bootstrap_components as dbc
import requests

# 创建应用
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
server = app.server

# 页面布局
app.layout = html.Div(
    className='body',
    children=[
        html.Div(
            className='questionnaire',
            children=[
                html.Div(
                    children=[
                        dcc.Input(
                            className='num_input',
                            id='num1_input',
                            type="number",
                            debounce=True
                        ),
                        dcc.Input(
                            className='num_input',
                            id='num2_input',
                            type="number",
                            debounce=True
                        )
                    ]
                )
            ]
        ),
        html.Div(
            className='submit-button',
            children=[dbc.Button('Submit', id='submit-btn', size='lg', color='success', n_clicks=0)]
        ),
        html.Div(
            className='output',
            children=[
                html.H3(id='output_text'),
            ]
        )
    ]
)

@app.callback(Output('output_text', 'children'),
    Input('submit-btn', 'n_clicks'),
    State('num1_input', 'value'),
    State('num2_input', 'value')
)
def update_output_div(n_clicks, num1_input, num2_input):
    if n_clicks > 0 :
        response = requests.get(
            'http://127.0.0.1:8000/add_numbers/',
            params={
                'num1': num1_input, 
                'num2': num2_input
            }, 
            timeout=10
        )
        json_response = response.json()
        sum_of_numbers = json_response.get('result')
        
        return sum_of_numbers
    else:
        return ['there must be 2 numbers']

if __name__ == '__main__':
    app.run_server(debug=True)

FastAPI后端示例代码

from fastapi import FastAPI

app = FastAPI()

# 定义求和函数
def sum_numbers(num1: int, num2: int):
   sum = num1 + num2
   return {'result': sum}

@app.get("/add_numbers/")
def sum_numbers_result(num1: int, num2: int):
    return sum_numbers(num1, num2)

目前因为找不到合适的解决方案,只能放弃客户端-服务端架构,把所有计算逻辑放到前端执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:34:56