我想在Azure Web App Services中托管我的bokeh服务器应用程序。按照flask_embed.py中的示例,我创建了一个最小示例,该示例具有在localhost:5006上运行的bokeh服务器进程,并在烧瓶路径中与server_document
一起提供了服务。在本地计算机上,它可以正常运行,没有任何错误:
from threading import Thread
from bokeh.embed import server_document
from bokeh.server.server import Server
from bokeh.models.widgets import Select, Div
from bokeh.layouts import column
from flask import Flask
from flask import render_template
from tornado.ioloop import IOLoop
app = Flask(__name__)
# This is the bokeh page
def modify_doc(doc):
dropdown = Select(title="Cities", options=["New York", "Berlin"])
title_row = Div(text="Home Page")
main_layout = column([
title_row,
dropdown
])
doc.add_root(main_layout)
doc.title = "My bokeh server app"
# This is the subprocess serving the bokeh page
def bk_worker():
server = Server(
{'/bkapp': modify_doc},
io_loop=IOLoop(),
allow_websocket_origin=["*"],
)
server.start()
server.io_loop.start()
Thread(target=bk_worker).start()
# This is the flask route showing the bokeh page
@app.route("/", methods=["GET"])
def my_app():
script = server_document("http://localhost:5006/bkapp")
return render_template("embed.html", script=script, template="Flask")
但是,当我将其推送到Azure Web应用程序时,该页面为空白,并且通过检查该页面会显示错误消息:
GET https://<my-azure-site>.azurewebsites.net:5006/bkapp/autoload.js?bokeh-autoload-element=0bfb1475-9ddb-4af5-9afe-f0c4a681d7aa&bokeh-app-path=/bkapp&bokeh-absolute-url=https://<my-azure-site>.azurewebsites.net:5006/bkapp net::ERR_CONNECTION_TIMED_OUT
似乎我无权访问远程Azure服务器的本地主机。实际上,我还不清楚bokeh服务器是否在运行/是否允许运行。在server_document
函数中,我尝试将server_document("<my-azure-site>:5006/bkapp")
放入,但问题仍然相同。
感谢您的帮助。
此帖子与另一个问题有关:Bokeh embedded in flask app in azure web app
答案 0 :(得分:1)
我意识到这是一段时间前的事,但是过去几天我花了很多时间来弄清楚这一点,所以这是给将来的人们使用的:
问题在于server_document()只是创建一个<script>
标记,该标记嵌入到执行的jinja2模板中。
在本地这不是问题,因为您的bokeh服务器正在您的机器的localhost:5006上运行。为了演示,您可以看到可以直接导航到localhost:5006 / bkapp来查看bokeh文档。
一旦将其托管在Azure上,server_document()将创建与浏览器将尝试执行的脚本完全相同的脚本-也就是说,您的浏览器将尝试执行引用localhost的<script>
标记:5006,不同之处在于,本地主机:5006上没有任何运行,因为您的bokeh应用程序现在实际上正在Azure的服务器上运行。
我不确定执行此操作的最佳方法是什么,但是其本质是您需要server_document()指向远程运行的bokeh服务器。为此,您需要确保{your_remote_bokeh_server}:5006可公开访问。