Я пытаюсь запустить несколько серверов 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 для фляги здесь:
Полный код
Большое вам спасибо за помощь