python - 我们可以在 Django 中使用 Bokeh curdoc() 吗

标签 python django bokeh

我想使用 bokeh 在 django 中实现实时图形。我尝试了很多方法,但对我来说没有任何效果。我得到的代码可以正常工作 bokeh serve 但不能在 django 中工作。任何人都可以帮助我吗?我被困了将近一个星期。代码如下:

import numpy as np
from bokeh.client.session import push_session
from bokeh.layouts import column
from bokeh.models import Button
from bokeh.palettes import RdYlBu3
from bokeh.plotting import figure, curdoc
import pandas as pd
import random
from bokeh.embed import components



# create a plot and style its properties
p = figure(x_axis_type="datetime", title="EUR USD", plot_width=1000)
p.grid.grid_line_alpha = 0
p.xaxis.axis_label = 'Date'
p.yaxis.axis_label = 'Price'
p.ygrid.band_fill_color = "olive"
p.ygrid.band_fill_alpha = 0.1

# p.border_fill_color = 'black'
# p.background_fill_color = 'black'
# p.outline_line_color = None
# p.grid.grid_line_color = None

# add a text renderer to out plot (no data yet)
r = p.line(x = [], y = [],  legend='close', color='navy')
s = p.triangle(x = [], y = [],  legend='sell', color='red' ,size=10 )
t = p.triangle(x = [], y = [],  legend='buy', color='green' ,size=10 )
# r = p.text(x=[], y=[], text=[], text_color=[], text_font_size="20pt",
#            text_baseline="middle", text_align="center")

i = 0

dr = r.data_source
ds = s.data_source
dt = t.data_source

# create a callback that will add a number in a random location
def callback():
    global i
    a=fxdata()[0]
    val = np.random.random()*70 + 15
    dr.data['x'].append(i)  #     np.datetime64(str(a[1]))
    dr.data['y'].append( val )  #     np.float(a[2])
    rm = random.randint(1,10)
    if rm <= 2:
        ds.data['x'].append(i)  # np.datetime64(str(a[1]))
        ds.data['y'].append(val)
    elif rm >=9 :
        dt.data['x'].append(i)  # np.datetime64(str(a[1]))
        dt.data['y'].append(val)
    else:
        pass
    # ds.data['text_color'].append(RdYlBu3[i%3])
    # ds.data['text'].append(str("MJ"))
    dr.trigger('data', dr.data, dr.data)
    ds.trigger('data', ds.data, ds.data)
    dt.trigger('data', dt.data, dt.data)
    i = i + 1

# add a button widget and configure with the call back
button = Button(label="Press Me")
# button.on_click(callback)



# put the button and plot in a layout and add to the document
curdoc().add_root(column(button, p))
curdoc().add_periodic_callback(callback, 1000)

我使用随机数尝试了这个简单的实时绘图。我想要在 django 中做同样的事情。谁能帮我?帮助将不胜感激。

最佳答案

如果您想在与 Django 应用程序相同的进程中运行 Bokeh 服务器,即您不想运行单独的 bokeh serve 进程并使用 将其嵌入到您的 Django 应用程序中server_document,那么你必须embed the Bokeh server as a library .

def modify_doc(doc):
    # set up app here, use doc.add_root(...)

def bk_worker():
    # Can't pass num_procs > 1 in this configuration. If you need to run multiple
    # processes, see e.g. flask_gunicorn_embed.py
    server = Server({'/bkapp': modify_doc}, io_loop=IOLoop(), allow_websocket_origin=["localhost:8000"])
    server.start()
    server.io_loop.start()

from threading import Thread
Thread(target=bk_worker).start()

然后你可以得到一个脚本来以通常的方式嵌入应用程序:

script = server_document('http://localhost:5006/bkapp')

并将其包含在您的页面模板中应嵌入应用程序的任何位置。

关于python - 我们可以在 Django 中使用 Bokeh curdoc() 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49170875/

相关文章:

python - 为什么仅导入 OpenCV 会导致大量 CPU 使用?

Python-更新字典列表中的值

python - 如果字段为 None,Django 模型字段如何采用默认值

Flask + Bokeh AjaxDataSource

python - 等效的 vmin vmax matplotlib Bokeh

python - Bokeh 条形图 : color bars by category

Python findall 使用正则表达式抓取 HTML 标签内的数据

python - Django 模型使用另一个模型的文本选择

django: getattr 函数(获取字段名)

python - 使用 ReportLab 将数据框转换为 PDF 中的 GRID。我怎样才能在网格的一列中划线