私はFlask-Socketsを試しています。過去にBlueprintsのサポートが追加されました。本当に必要なことです。ブループリント内でPython Flask-Socketsが機能しない
from flask import Flask, request, abort, redirect, url_for, render_template, make_response, Response, jsonify, session
import json
#Importing blueprints
from play import play, play_socket
app = Flask(__name__)
sockets = Sockets(app)
app.register_blueprint(play, url_prefix=r"/play")
sockets.register_blueprint(play_socket, url_prefix=r"/play")
@sockets.route('/echo')
def echo_socket(ws):
while not ws.closed:
message = ws.receive()
response = json.dumps({"Message":message,"Response":"Message received"})
ws.send(response)
ので、JavaScriptでのWebSocketを接続し、エンドポイントを設定すると、 'エコーは'(すなわちvar ws = new WebSocket("ws://HOST:PORT/"+"echo")
は)完璧に動作します。私はメッセージを送ることができ、彼らは私に戻ってバウンスします。
私は青写真にこの機能を移動したいときしかし、(青写真play_socket
で、それはもう動作しません、私はJavaScriptで「/ status_ping」にエンドポイントを変更すると仮定します。
@play_socket.route('/status_ping')
def ping(ws):
while not ws.closed:
message = ws.receive()
response = json.dumps({"Message":message,"Response":"Message received"})
ws.send(response)
websocketはクライアント側から正常に接続されており、これを確認するにはprint("HERE")
などのものをdef ping(socket):
に挿入して確認できますが、後ですぐに閉じて無駄にします。
私は、ヘッダの上のwhile not ws.closed:
ループそれをコピーする)、それは '働く'。しかし、サーバーからクライアントにデータをプッシュするためにソケットが必要なので、これを使用することはできません。このwhileループが実行されると間違っているようです。ソケットは何らかの理由ですぐに閉じられます。 while not ws.closed:
〜while True:
を変更しても効果はありません。
私は可能な限り問題を切り離そうとしましたが、詳細が必要な場合は教えてください。
EDIT:青写真のための
Codesamplefrom flask import Flask, request, abort, redirect, url_for, render_template, make_response, Response, jsonify, session, current_app
import sys
sys.path.append('../')
from flask_sockets import Sockets
import json
import time
api_blueprint = Blueprint('api_blueprint', __name__)
@sockets.route('/update_status')
def echo_socket(ws):
message = ws.receive()
while not ws.closed:
ws.send(json.dumps({"data":message}))
time.sleep(1)
if ws.closed:
session.clear()
print("session cleared")
sockets = Sockets(current_app)
sockets.register_blueprint(api_blueprint, url_prefix=r"/api")
app
コンテキストが利用可能であるメインrun.py
ファイルは、これを起動する:
if __name__ == "__main__":
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
server = pywsgi.WSGIServer(('0.0.0.0', 15080), app, handler_class=WebSocketHandler)
print(server)
server.serve_forever()
は、あなたがこの問題を解決できましたか? – BKC