0

什么有效

我在Flask中创建了一个简单的 Web 应用程序,它负责return render_template("index.html")在 Web 浏览器访问根节点时操作一个简单的应用程序。

# app.py
from flask import Flask, render_template
app = Flask(__name__)

@app.route("/")
def show_index():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(port=80)

index.html 是一个简单的页面,它使用tracking.js来获取用户网络摄像头并在实时视频流中跟踪他/她的脸。

打开cmd并输入python app.py结果Running on http://127.0.0.1:80/

访问上述 URL 会导致页面正确显示,该页面要求我允许使用相机,打开它并在实时视频源中正确跟踪我的脸。所以到这里一切都很好。

什么不起作用

当我使用Docker对我的应用程序进行 dockerize 时,就会出现我遇到的问题。docker-machine ip是 192.168.99.100

打开 cmd 并输入:docker run -p 4000:80 my_face_track_app结果:Running on http://0.0.0.0:80/

访问 192.168.99.100:4000 会导致正确显示,index.html但不再要求我获得相机权限并检查 JS 控制台我读到以下异常:

getUserMedia() no longer works on insecure origins

这里是完整的错误日志:

在此处输入图像描述

我知道错误告诉我我没有在 HTTPS 中提供页面。

有没有其他人遇到过这个问题?该问题的正确解决方案或可能的解决方法是什么?任何帮助将不胜感激,在此先感谢您

我为解决问题而尝试做的事情

由于需要页面的 HTTPS 服务才能让 JS 执行该功能getUserMedia(),因此我通过修改 app.py 来为我的 Flask 应用程序提供 SSL 证书,如下所示:

# app.py
from flask import Flask, render_template
import OpenSSL

app = Flask(__name__)

@app.route("/")
def show_index():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(port=80, ssl_context="adhoc")

然后我将构建一个新图像的应用程序 docker 化。打字:

docker run -p 443:80 facetrackapphttps

结果是

 Running on https://127.0.0.1:80

所以是的,这里 HTTPS 是 ON:问题是 HTTPS Flask App 的端口 80 映射到docker-machine ip192.168.99.100 的端口 443。

尝试访问 192.168.99.100:443 不起作用,并且没有显示任何内容。

有人知道如何做到这一点吗?

4

1 回答 1

2

如果您的应用程序绑定到127.0.0.1容器内,您将无法从主机访问它。根据烧瓶文档,烧瓶默认绑定到 127.0.0.1。

您需要修改您的服务,使其绑定到0.0.0.0容器内部:

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80, ssl_context="adhoc")
于 2018-11-14T14:41:19.727 回答