工作原理
我在 Flask 中创建了一个简单的Web应用程序,当通过Web浏览器访问根节点时,它负责操作一个简单的return render_template("index.html")
。
# 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 对应用程序进行docker化时出现的。 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来使用SSL证书为Flask应用程序提供服务:
# 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处于打开状态:问题是HTTPS Flask App的端口80映射到docker-machine ip
192.168.99.100的端口443。
尝试访问192.168.99.100:443无效,并且未显示任何内容。
有人对此有想法吗?
答案 0 :(得分:2)
如果您的应用程序绑定到容器内的127.0.0.1
,则您将无法从主机访问它。根据{{3}},烧瓶默认会绑定到127.0.0.1。
您需要修改服务,以使其绑定到容器内的0.0.0.0
:
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80, ssl_context="adhoc")