Многократная интеграция сервера Bokeh в колбу - PullRequest
0 голосов
/ 20 марта 2019

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

  def getTimePlot():
   script = server_document('http://localhost:5006/timeseries')
   return render_template("displaytimeseries.html", script=script, template="Flask")    
def startPlotserver():
    server.start()
    server = Server({'/timeseries': modifyTimeSeries}, io_loop=IOLoop(), allow_websocket_origin=["localhost:8000"])
    server.io_loop.start() 
if __name__ == '__main__':
    print('Opening single process Flask app with embedded Bokeh application on http://localhost:8000/')
    print()
    print('Multiple connections may block the Bokeh app in this configuration!')
    print('See "flask_gunicorn_embed.py" for one way to run multi-process')
    app.run(port=5000, debug=True)

но когда я пытаюсь объединить два сервера в колбу, используя этот подход, вот где я получаю проблемы:

структура файла:

|--app4
    |---webapp2.py
    |---bokeh
          |--timeseries.py
          |--map.py

Я думаю, что я нашел обходной путь здесь Ссылка на вопрос Я пытаюсь сейчас импортировать картографический сервер в Flak, используя аналогичный метод, упомянутый выше, и в результате чего-то вроде этого:

1. Конструктор файлов (не уверен, почему он его не берет)

def build_single_handler_applications(paths, argvs=None):
applications = {}
argvs = {} or argvs
for path in paths:
    application = build_single_handler_application(path, argvs.get(path, []))
    route = application.handlers[0].url_path()
    if not route:
        if '/' in applications:
            raise RuntimeError("Don't know the URL path to use for %s" % (path))
    route = '/'
    applications[route] = application
return applications

2. Код для поиска файла и создания соединения

    files=[]
for file in os.listdir("bokeh"):
    if file.endswith('.py'):
        file="map"+file
        files.append(file)

argvs = {}
urls = []
for i in files:
    argvs[i] = None
    urls.append(i.split('\\')[-1].split('.')[0])
host = 'http://localhost:5006/map'

apps = build_single_handler_applications(files, argvs)

bokeh_tornado = BokehTornado(apps, extra_websocket_origins=["localhost:8000"])
bokeh_http = HTTPServer(bokeh_tornado)
sockets, port = bind_sockets("localhost:8000", 5000)
bokeh_http.add_sockets(sockets)

3. Код, который вызывает сервер и отображает шаблон

    @app.route('/crimeMap', methods=['GET'])
def getCrimeMap():
    bokeh_script = server_document("http://localhost:5006:%d/map" % port) 
    return render_template("displaymap1.html", bokeh_script=bokeh_script)

я запускаю оба моих сервера Bokeh в одной команде, как эта

bokeh serve timeseries.py map.py --allow-websocket-origin=127.0.0.1:5000

но когда я запускаю webapp2.py, я получаю эту ошибку:

    (env1) C:\Users\Dell1525\Desktop\flaskapp\env1\app4>webapp2.py
Traceback (most recent call last):
  File "C:\Users\Dell1525\Desktop\flaskapp\env1\app4\webapp2.py", line 113, in <module>
    apps = build_single_handler_applications(files, argvs)
  File "C:\Users\Dell1525\Desktop\flaskapp\env1\app4\webapp2.py", line 29, in build_single_handler_applications
    application = build_single_handler_application(path, argvs.get(path, []))
NameError: name 'build_single_handler_application' is not defined

Я нашел и добавил функцию build_single_handler_application из документов Bokeh только из-за этой ошибки, поэтому я не уверен, была ли она вообще обязательной или правильной. Мне интересно, что мне не хватает, чтобы заставить эту работу работать на тот случай, если это ошибка позиционирования или отсутствует импорт. Я прилагаю полный код webapp2.py для фляги здесь:

Полный код

Большое вам спасибо за помощь

1 Ответ

0 голосов
/ 20 марта 2019

Я нашел более простое решение, немного подправив этот пример: Ссылка на оригинальное сообщение Обратите внимание, что для этого необходим торнадо 4.4.1, так как он не работает с более новыми версиями

Хитрость заключается в том, чтобы запускать все серверы по отдельности и на разных портах с одинаковым доступом к сокетам, как это

  bokeh serve timeseries.py --port 5100 --allow-websocket-origin=localhost:5567

bokeh serve map.py --port 5200 --allow-websocket-origin=localhost:5567

для тех, кто может найти это полезным, я включил полное рабочее решение Ссылка на рабочий код

...