2015-04-09 2 views
1

У меня есть веб-приложение Pyramid, на котором клиенту хотелось бы иметь возможность строить большие массивы данных в интерактивном режиме.Настроить Blaze и запустить сервер Bokeh из веб-приложения Pyramid

Приложение в настоящее время отображает подмножество выбранных данных клиента с возможностями масштабирования, панорамирования, наведения и т. Д. С использованием D3. Тем не менее, в случае, когда пользователю нужно видеть полный набор с одинаковой функциональностью, я хотел бы использовать сервер Bokeh и использовать сэмплирование по дате.

Где я столкнулся с проблемой, так это то, что функция сэмплирования может использоваться только с графиками, использующими ServerDataSource.

В идеале сервер Bokeh будет работать постоянно, и я могу нажать на него выбранные данные клиента, а затем использовать его как источник для сэмплированного участка. Однако, насколько я могу судить, Blaze не позволяет мне передавать данные на существующий сервер.

Вместо этого я подумал, что когда пользователь запросил сюжет, я мог бы использовать один из видов Pyramid для изменения конфигурационного файла Blaze, а затем запустить сервер Bokeh.

@view_config(route_name='startBokehServer', renderer = 'json',permission='view') 
def startBokehServer_view(request): 

    r""" 

    Configures blaze_config.py file to create a dict containing customer's select reversal data 
    Starts Bokeh server using modified blaze_config.py file at http://localhost:5006 

    """ 
    bokeh_server.run() 

После того, как данные были сохранены на сервере, другой вид бы построить кривую с сервером Bokeh в качестве источника данных.

@view_config(route_name='fetchPlotDataRev', renderer = 'json',permission='view') 
def fetchPlotDataRev_view(request): 

    r""" 

    Plots full reversal data using Bokeh's down-sampling method. 

    """ 
    from bokeh.plotting import output_server, figure, show 
    from bokeh.models import HoverTool, Range1d 
    from bokeh.transforms import line_downsample  

    output_server("Full Reversal Curve(s)") 
    c=bokeh_client('http://localhost:5006') 
    d=bokeh_data(c) 

    rev=d.rev 

    source=line_downsample.source() 
    source.from_blaze(rev,local=True) 

    TOOLS="pan,wheel_zoom,box_zoom,reset,hover" 
    p = figure(title="Reversal with tooltip", tools=TOOLS) 

    p1=p.scatter(x='time',y='aa_cd',color='#0000ff',source=source) 
    p1.select(dict(type=HoverTool)).tooltips=[("(x,y)", "($x, $y)"),] 

    p2=p.scatter(x='time',y='aa_cv',color='#ff0000',source=source) 
    p2.select(dict(type=HoverTool)).tooltips=[("(x,y)", "($x, $y)"),] 

    xmin=float(rev.time.min()) 
    xmax=float(rev.time.max()) 
    ymin=float(rev.aa_cv.min()) 
    ymax=float(rev.aa_cd.max()) 

    p.x_range=Range1d(start=xmin,end=xmax) 
    p.y_range=Range1d(start=ymin,end=ymax)   

    show(p) 

Наконец, сигнал с JavaScript, что окно сервера Bokeh было закрыто Отправляет запрос на другую точку зрения, что бы остановить сервер.

@view_config(route_name='stopBokehServer', renderer = 'json',permission='view') 
def stopBokehServer_view(request): 

    r""" 

    Stops Bokeh server. 

    """ 
    bokeh_server.start.stop() 

Однако при попытке выполнить/startBokehServer приложение выходит со статусом 2. Отслеживание включено ниже.

usage: pserve [-h] [--ip IP] [--port PORT] [--url-prefix URL_PREFIX] 
     [-D BLAZE_CONFIG] [-m] [--script SCRIPT] [--backend BACKEND] 
     [--redis-port REDIS_PORT] [--start-redis] [--no-start-redis] 
     [--ws-conn-string WS_CONN_STRING] [-d] [--dev] [--filter-logs] 
     [-j] [-s] [--robust-reload] [-v] 
pserve: error: unrecognized arguments: development.ini 
/home/katmeg/mat-cruncher/PyramidAnalysis 
2015-04-09 12:20:53,730 ERROR [waitress][Dummy-11] Exception when serving /startBokehServer 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/waitress-0.8.9-py2.7.egg/waitress/channel.py", line 337, in service 
task.service() 
    File "/usr/local/lib/python2.7/dist-packages/waitress-0.8.9-py2.7.egg/waitress/task.py", line 173, in service 
self.execute() 
    File "/usr/local/lib/python2.7/dist-packages/waitress-0.8.9-py2.7.egg/waitress/task.py", line 392, in execute 
app_iter = self.channel.server.application(env, start_response) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid-1.5.1-py2.7.egg/pyramid/router.py", line 242, in __call__ 
response = self.invoke_subrequest(request, use_tweens=True) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid-1.5.1-py2.7.egg/pyramid/router.py", line 217, in invoke_subrequest 
response = handle_request(request) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid_debugtoolbar-2.3-py2.7.egg/pyramid_debugtoolbar/toolbar.py", line 178, in toolbar_tween 
response = _handler(request) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid_debugtoolbar-2.3-py2.7.egg/pyramid_debugtoolbar/panels/performance.py", line 57, in resource_timer_handler 
result = handler(request) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid-1.5.1-py2.7.egg/pyramid/tweens.py", line 21, in excview_tween 
response = handler(request) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid-1.5.1-py2.7.egg/pyramid/router.py", line 163, in handle_request 
response = view_callable(context, request) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid-1.5.1-py2.7.egg/pyramid/config/views.py", line 245, in _secured_view 
return view(context, request) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid-1.5.1-py2.7.egg/pyramid/config/views.py", line 355, in rendered_view 
result = view(context, request) 
    File "/usr/local/lib/python2.7/dist-packages/pyramid-1.5.1-py2.7.egg/pyramid/config/views.py", line 501, in _requestonly_view 
response = view(request) 
    File "/home/katmeg/mat-cruncher/PyramidAnalysis/pyramidanalysis/views.py", line 649, in startBokehServer_view 
bokeh_server.run() 
    File "/home/katmeg/pyrEnv/local/lib/python2.7/site-packages/bokeh/server/__init__.py", line 134, in run 
args = parser.parse_args(sys.argv[1:]) 
    File "/usr/lib/python2.7/argparse.py", line 1691, in parse_args 
self.error(msg % ' '.join(argv)) 
    File "/usr/lib/python2.7/argparse.py", line 2347, in error 
self.exit(2, _('%s: error: %s\n') % (self.prog, message)) 
    File "/usr/lib/python2.7/argparse.py", line 2335, in exit 
_sys.exit(status) 
SystemExit: 2 

Примечание: Графики работы, как я намереваюсь их, когда я запустить исполняемый бок-сервер из командной строки, а затем создать и обслуживать их из отдельного сценария Python.

Итак, мои вопросы таковы: Могу ли я передать данные на уже запущенный сервер Bokeh, а затем использовать его в качестве источника данных для сэмплирования? И если нет, как я могу запустить/остановить сервер Bokeh по запросу в приложении Pyramid?

Заранее благодарим за любую помощь!

+0

Не запускайте его из приложения пирамиды ... запустите его с помощью upstart –

+0

@ JoranBeasley могу ли я запустить его с выскочкой из Python, когда пользователь запросит его? – katmeg

ответ

1

Вот как приложение динамически настраивает источник данных сервера, запускает сервер Bokeh и отображает запрошенные данные на сервере Bokeh для навигации по клиенту.

Данные, подлежащие построению, передаются в представление startBokehServer, где оно записывается во временный текстовый файл. Затем сервер Bokeh запускается с помощью Python subprocess и файла конфигурации, который читает текстовый файл и настраивает данные таким образом, чтобы их можно было прочитать Blaze.

views.py

@view_config(route_name='startBokehServer',renderer = 'json',permission='view') 
def startBokehServer_view(request): 

    # plotDataRev is dictionary containing data requested from web page 
    with open('pyramidanalysis/temp/reversal_data.txt','wb') as handle: 
     pickle.dump(plotDataRev,handle) 
    bokeh_pid=str(subprocess.Popen(['/bokeh-server','-D','blaze_config.py'],stdout=subprocess.PIPE).pid) 
    request.session['bokehPID']=bokeh_pid 

blaze_config.ру

import pandas as pd 
import pickle 

with open('pyramidanalysis/temp/reversal_data.txt','rb') as handle: 
    b=pickle.loads(handle.read()) 

data=dict() 

keys=b.keys() 
for key in keys: 
    data[key]=pd.DataFrame(b[key]) 

страница сервера затем отображается в плавающем фрейме на веб-странице и закрытие фрейма или главное окно инициирует другой вид, завершающего сервер Боке и удаляет временный текстовый файл.

Смежные вопросы