azure - Azure Web 应用服务上的 Flask + Bokeh 服务器
问题描述
我想在 Azure Web App Services 中托管我的散景服务器应用程序。按照flask_embed.py中的示例,我创建了一个最小示例,其中一个散景服务器进程在 localhost:5006 上运行并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 服务器的本地主机。实际上,我还不清楚散景服务器是否运行/是否允许运行。在server_document
我尝试过的功能中,server_document("<my-azure-site>:5006/bkapp")
但问题仍然存在。
任何帮助表示赞赏。
这篇文章与另一个问题有关:Bokeh embedded in flask app in azure web app
解决方案
我意识到这是不久前的事情,但在过去的几天里我花了很多时间来解决这个问题,所以这是为未来的人准备的:
问题是 server_document() 只是创建了一个<script>
嵌入到 jinja2 模板中的标签,并在其中执行。
在本地这不是问题,因为您的散景服务器正在您的机器的 localhost:5006 上运行。为了演示,您可以看到您可以直接导航到 localhost:5006/bkapp 以查看您的散景文档。
在 Azure 上托管它后,server_document() 将创建与浏览器尝试执行的完全相同的脚本 - 也就是说,您的浏览器将尝试执行<script>
引用 localhost:5006 的标记,除了没有t 任何在 localhost:5006 上运行的东西,因为您的散景应用程序现在实际上正在 Azure 的服务器上运行。
我不确定最好的方法是什么,但它的本质是您需要 server_document() 指向远程运行的散景服务器。为此,您需要确保 {your_remote_bokeh_server}:5006 可公开访问。
推荐阅读
- reactjs - React HighCharts 自定义图例
- css - 如何隐藏 v-text-field 键入日期的图标
- c++ - 为 LeetCode 问题 Max Frequency Stack 获取未对齐地址错误的引用绑定
- kubernetes - Kubespray 和 Ansible,如何分离配置(即清单和其他配置文件)
- python - 在 matplotlib 散点图中添加过滤
- perl - 在@INC 中找不到 MIME/Types.pm
- apache-kafka - Apache Kafka 的 Spring 中的侦听器容器是什么?
- xcodebuild - xcdebuild ios14 与 googleMap 框架构建
- python - 将在 discord.py 中编码的机器人上传到服务器时出现问题
- laravel - 将查询转换为从 Postgres 到 Laravel Eloquent 的 jsonb 字段中的搜索?