gpt4 book ai didi

python - 使用 HTTP 请求控制 Bokeh 图状态

转载 作者:行者123 更新时间:2023-12-04 18:00:10 24 4
gpt4 key购买 nike

我正在创建一个 Bokeh 应用程序,并希望使状态(影响图形的小部件)“可共享”。我的第一个想法是在 URL 中使用查询字符串。但是,我不确定实际的 HTTP 请求是否可用于应用程序。

一个例子:

# main.py
from bokeh.models.widgets import Select
from bokeh.plotting import Figure
from bokeh.io import curdoc, vform

p = Figure()
selector = Select(title="Select", options=["1", "2", "3"], value="2")

p.line([1, selector.value], [1, selector.value])

curdoc().add_root(vform(p, selector))

它由 bokeh serve main.py 提供,可在 http://localhost:5006/main 访问。

如果我导航到 http://localhost:5006/main?select=3,应用程序有没有办法知道原始请求包含 select=3 并在图中反射(reflect)了这一点上升到 3 而不是默认的 2?或者我是不是以完全错误的方式来解决这个问题,而错过了更好的解决方案?

This问题和答案是相关的,但我认为 Bokeh 服务器构建在 tornado 上已经过时了。

最佳答案

最终我能够让它工作。我不确定我是否真的会推荐任何人使用此代码,但万一它有用....

我将 Bokeh 应用程序包装在 Flask 应用程序中。基本思想是在 flask View 中解析查询参数,遍历 Bokeh 文档,按照查询参数的指示更新对象。

我更新了 main.py 以包含 state,一个由查询参数控制的小部件列表

# file: main.py
# ...
state = [selector]
# ...

我们将其导入到 Flask(或 Django/其他)应用程序 app.py 中。

# file: app.py
import json
from urllib.parse import urlencode

from flask import Flask, request, render_template

from bokeh.client import pull_session
from bokeh.embed import autoload_server
app = Flask(__name__)


@app.route('/')
def index():
session = pull_session(app_path='/main')
doc = session.document
update_document(doc, request) # this is the important part
script = autoload_server(model=None,
app_path='/main', session_id=session.id)
return render_template('index.html', script=script, session_id=session.id)


def update_document(doc, request):
'''
Update a Bokeh document according to the query string in ``request``

Parameters
----------
doc: Bokeh.Document
request: flask.request

Returns
-------
None: (Modifies doc inplace)
'''
for k, v in request.args.items():
# titles must be unique
model = doc.select_one(dict(title=k))
v = parse_query_value(v)
model.update(value=v)


def parse_query_value(v):
'''
Parse a single parameter's value from the query string

Parameters
----------
v : str

Returns
-------
parsed : object
'''
if v.startswith('['):
return json.loads(v.replace("'", '"'))
return v


@app.route('/state/<session_id>')
def get_state(session_id):
'''
Get the current widget state.

Parameters
----------
session_id : int
id of the connection to the bokeh server from ``session.id``.
this should be unique per tab.
'''
session = pull_session(app_path='/main',
session_id=session_id)
doc = session.document
params = {}
for key in state:
params[key] = doc.select_one(dict(title=key)).value
return urlencode(params)


if __name__ == '__main__':
app.run()

index.html

<html>
<head>
<meta charset="UTF-8">
<title>Title</title>

</head>
<body>
<h1 class='title'>Title</h1>

<div class="plot">{{ script|safe }}</div>

</body>

</html>

关于python - 使用 HTTP 请求控制 Bokeh 图状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com