能否通过HTTP请求调用Dash应用并传递数据,服务端如何接收?
问题解答:通过HTTP请求调用Dash应用并传递数据
核心问题原因
- HTTP协议不推荐GET请求携带请求体,Dash底层依赖的Flask框架默认会忽略GET请求的body内容,因此你无法通过
flask.request读取到GET请求body里的payload。 - 你已经收到应用HTML响应,说明服务端实际响应了请求,无打印输出大概率是你打印
flask.request的代码位置不对,没有放在路由处理/页面布局生成的逻辑内。
可行解决方案
方案1:GET请求传递查询参数(推荐)
GET请求适合把参数拼接在URL的查询字符串中,客户端修改请求代码如下:
import requests payload = {'download': True} def make_request(): url = "http://127.0.0.1:8050/app1" # 用params参数传递,requests会自动拼接为查询串 r = requests.get(url, params=payload) print(r.text)
服务端在布局生成函数中读取参数即可:
from dash import Dash, html import flask app = Dash(__name__) # 布局用函数返回,每次请求都会重新执行逻辑 def app_layout(): # 打印请求对象 print(flask.request) # 读取GET查询参数 download_flag = flask.request.args.get("download", False) return html.Div([html.P(f"下载参数值:{download_flag}")]) app.layout = app_layout if __name__ == '__main__': app.run(port=8050)
方案2:POST请求传递body参数
如果参数内容较多或者敏感,可改用POST请求,客户端修改代码如下:
import requests import json payload = {'download': True} def make_request(): url = "http://127.0.0.1:8050/app1" # 改用post方法,json参数自动序列化并设置正确请求头 r = requests.post(url, json=payload) print(r.text)
服务端需要修改路由配置,允许POST方法:
from dash import Dash, html import flask app = Dash(__name__) # 获取底层Flask实例,修改路由支持POST server = app.server server.url_map.strict_slashes = False for rule in server.url_map._rules: if rule.rule == '/app1': rule.methods = {'GET', 'POST'} def app_layout(): print(flask.request) # 读取POST请求的JSON body if flask.request.method == 'POST': download_flag = flask.request.get_json().get("download", False) else: download_flag = flask.request.args.get("download", False) return html.Div([html.P(f"下载参数值:{download_flag}")]) app.layout = app_layout if __name__ == '__main__': app.run(port=8050)
内容的提问来源于stack exchange,提问作者Jakub Pluta
相关产品推荐
相关产品推荐

