Доступ к статическому каталогу при использовании Bokeh в качестве библиотеки

#python #bokeh #tornado

#python #bokeh #торнадо

Вопрос:

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

 from tornado.ioloop import IOLoop
from bokeh.server.server import Server
from bokeh.plotting import curdoc

io_loop = IOLoop.current()
server = Server(applications={'/myapp': self.make_document},
                io_loop=io_loop,
                allow_websocket_origin=['{0}.com:5001'.format(
                    hostname.lower()), 'localhost:5001'],
                port=5001,
                )
  
server.start()
server.show('/myapp')
io_loop.start()
 

Запускаю python main.py , но я не могу получить доступ к статическому каталогу /myapp/static .

Если я вместо этого сделаю:

 self.make_document(curdoc())
 

И начать myapp использовать bokeh server --show myapp я могу получить доступ к статическому просто отлично, но при каждом подключении к новой вкладке браузера открывается новый вид.

Есть ли способ получить доступ к статическому каталогу в режиме библиотеки? Или способ предоставления одного и того же представления для всех подключений и по-прежнему использовать режим документа bokeh.

Ответ №1:

Найден ответ в примере встраивания торнадо в Боке

 from tornado.web import StaticFileHandler
from tornado.ioloop import IOLoop
from bokeh.server.server import Server
from bokeh.plotting import curdoc

io_loop = IOLoop.current()
server = Server(applications={'/myapp': self.make_document},
                io_loop=io_loop,
                allow_websocket_origin=['{0}.com:5001'.format(
                    hostname.lower()), 'localhost:5001'],
                port=5001,
                extra_patterns=[
                    (r'/mydir/(.*)', StaticFileHandler, {'path': 
                    os.path.normpath(os.path.dirname(__file__)   '/mydir')})],
                )
  
server.start()
server.show('/myapp')
io_loop.start()
 

Здесь mydir он должен находиться в myapp каталоге, а не в родительском.