首页 > 解决方案 > 为什么我的烧瓶应用程序上的小部件在本地显示时没有显示在 EC2 实例上?

问题描述

我正在尝试使用弹性 beantalk 在 aws EC2 实例上部署烧瓶应用程序。flask 应用程序提供了一个 Bokeh 小部件,该小部件被读入 Jinja2 模板。

在我的本地机器上运行,我使用 app.run(host='0.0.0.0', port=8000) 运行烧瓶应用程序。我在“ http://localhost:5006/widget ”为小部件创建了一个服务器文档。当我打开http://localhost:8000时,页面会使用小部件呈现。我也可以打开 localhost:5006/widget,我会自己看到这个小部件。

现在,当我在弹性 beanstalk 上部署它时,我将小部件的服务器文档更改为 ':5006/widget' 并在 host= 上运行应用程序。如果我在浏览器中打开“:5006/widget”,它会再次向我显示我的小部件,该小部件会按应有的方式进行交互。但是,当我转到它时,会显示一个呈现所有 html 的页面,但该小部件不可见。此外,当我与修改小部件的页面交互时,我可以转到 :5006/widget 并且更改将显示在小部件上。小部件似乎可以正常工作并且可以与网页交互,但我只是不知道为什么小部件不会显示在主页上。

我在 5006 和 8000 上为 tcp 打开了入站端口,控制台中没有显示任何错误。什么可能阻止小部件显示?

编辑:试图澄清应用程序是如何嵌入的:

doc = bokeh.plotting.curdoc()
def createWidget(doc):
    p = figure(...)
    doc.add_root(p)

@app.route('/', methods=['GET', 'POST'])
def bkapp_page():
    widget = server_document('<ec2-ip>:5006/widget')
    return render_template("index.html", widget=widget, template="Flask")

def bk_worker():
    server = Server({'/widget': createWidget, io_loop=IOLoop(), allow_websocket_origin=["*"])
    server.start()
    server.io_loop.start()

from threading import Thread
thread = Thread(target=bk_worker)
thread.start()

if __name__ == '__main__':
    app.run(host=<ec2-ip>, port=5000)

然后在 index.html 我有 {{widget | 安全 }} 行。在本地运行我使用 server_document(' http://localhost:5006/widget ') 和 app.run(host=0.0.0.0, port=5000)。

编辑:正如 bigreddot 指出的,如果页面的 url 使用 https,则源必须使用 https。

标签: flaskamazon-ec2bokeh

解决方案


推荐阅读