部署在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
相关产品推荐
相关产品推荐

