質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

2172閲覧

flask, wsgiを用いたwebsocket通信について

Ma_sa

総合スコア14

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/13 07:53

前提・実現したいこと

flaskでwebsocket通信を行うプログラムを実装したいです。
WSGIServerを使用しています。

WSGI, websocketを初めて実装するので詳しい方からすると, めちゃくちゃなことをやっているかもしれません。
何卒よろしくお願いします。

参考にしたサイト
Flaskとwebsocketを使った簡易的なチャットを開発する

発生している問題・エラーメッセージ

ブラウザ上でwebsocket通信をつなぐことはできるのですが、その後すぐに接続が切れてしまいます。
CloseEvent.code, CloseEvent.reasonを調べたところ, reasonは取得できず, 1005というコードのみが返ってきました。

イメージ説明

実行環境

python 3.7
Ubuntu 18.04.2 LTS
ブラウザ: Google Chrome

Flask == 2.0.1 Flask-Sockets == 0.2.1 gevent == 21.1.2 gevent-websocket == 0.10.1 greenlet == 1.1.0 gunicorn == 20.1.0

該当のソースコード

app.py

python

1import json 2import datetime 3import time 4 5 6from gevent.pywsgi import WSGIServer 7from geventwebsocket.handler import WebSocketHandler 8 9from flask import Flask, request, render_template, Response 10 11app = Flask(__name__) 12app.config.from_object(__name__) 13 14 15@app.route('/') 16def index(): 17 return render_template('index.html') 18 19 20@app.route('/pipe') 21def pipe(): 22 print("connect python") 23 if request.environ.get('wsgi.websocket'): 24 ws = request.environ['wsgi.websocket'] 25 while True: 26 time.sleep(1) 27 message = ws.receive() 28 if message is None: 29 break 30 datetime_now = datetime.datetime.now() 31 data = { 32 'time': str(datetime_now), 33 'message': message 34 } 35 ws.send(json.dumps(data)) 36 print(message) 37 print(data) 38 return 39 40 41if __name__ == '__main__': 42 app.debug = True 43 host = 'localhost' 44 port = 8082 #諸事情で8082ポートを使用しています 45 46 host_port = (host, port) 47 server = WSGIServer( 48 host_port, 49 app, 50 handler_class=WebSocketHandler 51 ) 52 53 server.serve_forever()

index.html

html

1<html lang="ja"> 2 <head> 3 <meta charset="UTF-8"> 4 <title>Document</title> 5 </head> 6 <body> 7 <h1>websocket chat</h1> 8 9 <input type="text" id="msg" value="> message"/> 10 <button id="sendBtn">send</button> 11 <ul id="rcv"></ul> 12 </body> 13 14 <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script> 15 <script type="text/javascript"> 16 var host = "ws://localhost:8082/pipe"; 17 var ws = new WebSocket(host); 18 19 ws.onopen = function(){ 20 console.log("接続"); 21 }; 22 23 24 // Log errors 25 ws.onerror = function (error) { 26 console.log('WebSocket Error ' + error); 27 }; 28 29 ws.onclose = function (e) { 30 console.log("Close Reason = " + e.reason); 31 console.log("Close Code = " + e.code); 32 }; 33 34 ws.onmessage = function(message){ 35 36 var message_data = JSON.parse(message.data); 37 var time = message_data['time']; 38 var message = message_data['message']; 39 40 var string_txt = "[" + time + "] - " + message 41 $("#rcv").append("<li>" + string_txt + "</li>") 42 }; 43 44 $("#sendBtn").on("click",function(){ 45 console.log("button pushed!"); 46 message = $("#msg").val(); 47 console.log("message: " + message); 48 if (ws.OPEN){ 49 console.log("opening"); 50 } 51 ws.send(message); 52 console.log("hoge"); 53 }); 54 </script> 55</html>

試したこと

サーバプログラム内のpipe()でレスポンスを返すようなコードを追加したのですが、解決できませんでした。
というか、pipe()内でのprintをいくつか書いているのですが、コンソール上に何も表示されません。
そもそもルーティングできているのかも怪しい状態です。。。

python

1@app.route('/pipe') 2def pipe(): 3 print("connect python") 4 if request.environ.get('wsgi.websocket'): 5 ws = request.environ['wsgi.websocket'] 6 while True: 7 time.sleep(1) 8 message = ws.receive() 9 if message is None: 10 break 11 datetime_now = datetime.datetime.now() 12 data = { 13 'time': str(datetime_now), 14 'message': message 15 } 16 ws.send(json.dumps(data)) 17 print(message) 18 print(data) 19 return Response(response=json.dumps({'message': 'hello response'}), status=200) 20

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ma_sa

2021/06/13 12:47 編集

Flask==1.1.4にしたところ、期待通りの実行結果になりました。 本当にありがとうございます! 上記の内容を回答として記載していただければ、ベストアンサーに選びますのでよろしければぜひ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問