Docker環境下でのflask/websocket
Dockerのコンテナ内でflaskアプリケーションを立ち上げて、websocketを用いたリアルタイム通信の実装をしようとしていたのですが、下記コードのもとで
WebSocket connection to 'ws://0.0.0.0:5000/pipe' failed: Error during WebSocket handshake: Unexpected response code: 500
(anonymous)
のエラーが出ます。問題となりそうなソースは
app.py
from flask import Flask, jsonify, render_template, request
from src.database import init_db
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
import time
app = Flask(__name__)
app.config.from_object('src.config.Config')
init_db(app)
@app.route("/", methods=["GET"])
def main_page():
return render_template("index.html")
@app.route("/pipe")
def pipe():
if request.environ.get('wsgi.websocket'):
ws = request.environ['wsgi.websocket']
while True:
time.sleep(1)
ws.send("hello world")
return
if __name__ == '__main__':
app.debug = True
host = "0.0.0.0"
port = 5000
host_port = (host, port)
server = WSGIServer(
host_port,
app,
handler_class=WebSocketHandler
)
server.serve_forever()
docker-compose.yml
version: '3'
services:
api:
build: .
ports:
- "5000:5000"
volumes:
- "./src:/src"
tty: true
environment:
TZ: Asia/Tokyo
FLASK_APP: app.py
FLASK_ENV: development
command: flask run -h 0.0.0.0
db:
build: ./mysql/
volumes:
- ./mysql/sqls:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=
index.html
<html>
<head>
<script type="text/javascript">
var ws = new WebSocket("ws://0.0.0.0:5000/pipe");
ws.onmessage = function(e){
document.getElementById("text-field").innerHTML = e.data;
}
</script>
</head>
<body>
<h1>WEB_SOCKET_SAMPLE</h1>
<p id="text-field"></p>
</body>
</html>
host,portのあたりが怪しいのかもとは思っているのですが問題点はわからなかったです。