Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python、Bokeh、Javascript:在回调中使用Mongodb数据库查询_Javascript_Python_Mongodb_Bokeh - Fatal编程技术网

Python、Bokeh、Javascript:在回调中使用Mongodb数据库查询

Python、Bokeh、Javascript:在回调中使用Mongodb数据库查询,javascript,python,mongodb,bokeh,Javascript,Python,Mongodb,Bokeh,我正在使用bokeh,并开始探索它的javascript和回调方面 我有一段包含日期选择器的代码: 我希望回调在触发mongodb数据库时对其执行查询。 问题是我不懂javascript,需要一些指针来帮助我找到正确的方向 这是我到目前为止得到的代码: import pymongo import pandas as pd from bokeh.layouts import column from bokeh.models import CustomJS, DatePicker from boke

我正在使用bokeh,并开始探索它的javascript和回调方面

我有一段包含日期选择器的代码: 我希望回调在触发mongodb数据库时对其执行查询。 问题是我不懂javascript,需要一些指针来帮助我找到正确的方向

这是我到目前为止得到的代码:

import pymongo
import pandas as pd
from bokeh.layouts import column
from bokeh.models import CustomJS, DatePicker
from bokeh.plotting import figure, show, ColumnDataSource
from bokeh.io import curdoc
from bokeh.models.formatters import DatetimeTickFormatter
import datetime

p = figure(x_axis_type="datetime",plot_width=900, height=200, title="GBP")

mongo=pymongo.MongoClient()
start=datetime.datetime.today().replace(hour=0,minute=0,second=0,microsecond=0)
end=start+datetime.timedelta(hours=24)
data=pd.DataFrame.from_records(
                mongo.prices["Russia Ruble"].find({"datetime":
                                        {"$gte":start,"$lte":end}}))[["close","datetime"]]

source = ColumnDataSource(data.to_dict(orient="list"))

callback=CustomJS(args=dict(source=source),code='''
var data=source.data;
var f=cb_obj.value

start = f.replace(hour=0,minute=0,second=0,microsecond=0) # use a javacript equivalent of the python code here...
end= start +datetime.timedelta(hours=24) # use a javacript equivalent of the python code here...

data=pd.DataFrame.from_records(
            mongo.prices["Russia Ruble"].find({"datetime":
            {"$gte":start,"$lte":end}}))[["close","datetime"]] # use a javacript equivalent of the python code here...

source.change.emit()

''')

p.line(x = "datetime", y ="close", color="black", source=source)

datepicker=DatePicker(max_date=start,value=start)
datepicker.js_on_change("value",callback)
curdoc().add_root(column(p,datepicker))
起初,我试图看看是否可以在回调中执行一些python代码和一些javascript(或者只是一些python代码…),但似乎明确指出这是不可能的

因此,我接受了需要学习一些javascript才能完成任务的事实,并研究了mongo db和javascript。谷歌对这一主题的一项简单研究似乎表明了这一点,但我对此不太确定?bokeh js回调是否等同于服务器端javascript?然后(抱歉,它是用法语写的..但找不到任何英语的等效版本)解释说,为了将mongodb与node.js一起使用,我需要使用nodejs包管理器(npm)安装mongodb驱动程序。。。很明显我已经偏离轨道了

因此,总结一下:
-执行javascript回调中需要执行的简单操作的好方法是什么(即从datepicker选择的日期创建开始时间和结束时间,然后使用该时间范围从mongoddb数据库查询数据)

你能发布一些关于你的web应用程序的更多信息吗?它位于什么类型的服务器上

不幸的是,仅仅通过回调(即使您学习了javascript),您将无法完成您想要的任务

要解释这一点,你必须稍微了解一下博克是如何在引擎盖下工作的。如果使用独立html或使用
script,div=components(plot)
嵌入bokeh绘图,那么python只是在页面上嵌入的一个大脚本中为绘图创建一组定制的javascript函数和所有数据源的序列化。像“Figure”、“vbar”、“circle”这样的bokeh对象被称为模型,所有模型都用javascript表示,并在生成时给出它们的数据

生成脚本后,该脚本本身不会与服务器或数据库通信。相反,回调只是修改模型已有的属性。例如,columnDataSource模型具有某些列,并且所有这些列都被放入javascript中,因此您可以有一个回调来更改例如绘图中使用的列

正如文件所说:

Bokeh的体系结构是这样的:高级“模型对象” (表示绘图、范围、轴、图示符等)是 在Python中创建,然后转换为JSON格式 被客户端库BokehJS使用

如果您想使用python和数据库来保持模型的最新,这就是bokeh服务器的用例。Bokeh服务器是一个可嵌入的服务器,它将保持模型的所有python表示与javascript表示同步

再次提交:

但是,如果可以将“模型对象”保留在python和 在浏览器中彼此同步,然后更多附加和 强大的可能性立即打开:

使用python的全部功能,通过计算或查询响应浏览器中生成的UI和工具事件 这种在python和浏览器之间同步的功能是Bokeh服务器的主要用途

查看文档,看看这是否适用于您的用例

理论上,您可以使用JS函数从不同的路径获取JSON数据,并将数据推送到您的bokeh模型中,但我认为这是行不通的。Bokeh为每个模型和模型数据点生成大量唯一标识符,您需要在输入过程中查找和处理这些标识符


bokeh服务器上还有一个很棒的pycon演示。它比2015年稍老一些,但对理解这些概念确实很有帮助

谢谢你的回复!是的,这是我第一次尝试bokeh小部件,所以我有点迷路了。事实上,做我想做的事情很容易,只需使用
.on\u change
,而不是像我一开始尝试的那样使用
.js\u on\u change
。我通过查阅参考资料库的源代码找到了解决方案。