2017-12-02 141 views
0

我正在使用散景,並開始探索它的JavaScript和回調方面。Python,散景,Javascript:在回調中使用Mongodb數據庫查詢

我有一段包含日期選擇器的代碼: 我希望回調在觸發時對mongodb數據庫執行查詢。 事情是,我不知道JavaScript,並需要一些指針來幫助我在正確的方向。

這是我到目前爲止的代碼:我想看看是否有可能與一些JavaScript以及執行一些Python代碼

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代碼..)在回調,但this part of the doc似乎明確指出,這是不可能的。

所以我接受了這樣一個事實,我需要學習一些JavaScript來完成我的任務,並且研究了mongo db和javascript。關於這個話題的一個簡單的谷歌研究似乎表明,這would be close to what node.js is doing,但我不確定嗎?散景js回調是否等同於服務器端JavaScript?然後this page(對不起,這是法語..但無法找到任何等效的英文)解釋說,爲了使用mongodb和node.js,我需要使用nodejs軟件包管理器(npm)安裝mongodb驅動程序...那裏我顯然已脫離軌道...

所以回顧: - 什麼是執行我需要在我的javascript回調中執行的簡單操作的一種好方法(例如,從所選日期創建開始時間和結束時間由datepicker,然後使用該時間範圍查詢我的mongoddb數據庫中的數據)

回答

1

你能發佈一些關於你的web應用程序的更多信息以及它的服務器類型嗎?

不幸的是,你只用一個回調就不能完成你想要的東西(即使你學習的是JavaScript)。

爲了解釋這一點,你必須瞭解一些關於散景效果的內幕。如果您使用獨立html或使用script, div = components(plot)來嵌入散景圖,那麼python只是簡單地創建一組定製的javascript函數,並在您的頁面中嵌入一個大腳本中爲您的情節序列化所有數據源。諸如「圖」,「vbar」,「circle」之類的散景對象稱爲模型,所有模型都以javascript表示,並在生成時給出它們的數據。

僅當該腳本在生成後才與您的服務器或數據庫通信。相反,回調只是修改模型已有的屬性。例如,columnDataSource模型具有某些列,所有這些列都放入JavaScript中,因此您可以使用回調來更改在劇情中使用哪個列。

作爲文檔說:

散景的體系結構是這樣的,高級別「模型對象」 (代表之類的東西曲線,範圍,軸,字形,等等) 在Python創建,然後轉換成JSON格式, 客戶端庫消耗,BokehJS

如果你想使用Python,和你的數據庫,讓你的模型是最新的,那就是用例的背景虛化服務器。Bokeh服務器是一個可嵌入的服務器,將保持模型的所有python表示與javascript相同步。

同樣每documentation

但是,如果有可能保持在瀏覽器中蟒「模型對象」和 同步彼此,那麼更多的附加和 強大的可能性,立即打開:

在使用計算或查詢蟒蛇 這種能力的全功率Python和瀏覽器之間同步瀏覽器生成的用戶界面和工具的事件作出響應是主要目的Bokeh服務器。

看看在Bokeh Server文件,看看是否有可能工作您的使用案例。

從理論上講,你可以有一個JS函數從不同的路線獲取JSON數據,並將這些數據推送到你的散景模型中,但我認爲這不會起作用。 Bokeh爲每個模型和模型數據點生成大量的唯一標識符,您需要查看和處理路徑。

散景服務器上還有一個很棒的pycon演示文稿。它從2015年開始有點老,但對理解這些概念非常有幫助。 https://www.youtube.com/watch?v=O5OvOLK-xqQ

+0

thx您的回覆!是的,這是我第一次刺散景小部件,所以我有點迷路。事實上,按照我的想法做事非常容易,只需使用'.on_change'而不是'.js_on_change',就像我在第一次嘗試時那樣。我通過查找參考圖庫的源代碼找到了解決方案。 –