Я настраиваю приложение geventwebscoket на python, используя gevent-websocket .
В одном из примеров (chat-app), который почти совпадает с моим приложением,Я определяю приложение, которое обрабатывает подключения к веб-сокету и сообщения, например:
import json
from gevent import monkey
monkey.patch_all()
from flask import Flask, render_template
from werkzeug.debug import DebuggedApplication
from geventwebsocket import WebSocketServer, WebSocketApplication, Resource
flask_app = Flask(__name__)
flask_app.debug = True
class ChatApplication(WebSocketApplication):
def on_open(self):
print("Some client connected!")
def on_message(self, message):
if message is None:
return
message = json.loads(message)
if message['msg_type'] == 'message':
self.broadcast(message)
elif message['msg_type'] == 'update_clients':
self.send_client_list(message)
def send_client_list(self, message):
current_client = self.ws.handler.active_client
current_client.nickname = message['nickname']
self.ws.send(json.dumps({
'msg_type': 'update_clients',
'clients': [
getattr(client, 'nickname', 'anonymous')
for client in self.ws.handler.server.clients.values()
]
}))
def broadcast(self, message):
for client in self.ws.handler.server.clients.values():
client.ws.send(json.dumps({
'msg_type': 'message',
'nickname': message['nickname'],
'message': message['message']
}))
def on_close(self, reason):
print("Connection closed!")
@flask_app.route('/')
def index():
return render_template('index.html')
WebSocketServer(
('0.0.0.0', 8000),
Resource([
('^/chat', ChatApplication),
('^/.*', DebuggedApplication(flask_app))
]),
debug=False
).serve_forever()
Я хочу, чтобы в моем коде было несколько запланированных процессов, которые отправляют сообщение каждому клиенту, подключенному к веб-сокету.В примерах и ограниченной документации я не нахожу способа вызова метода широковещания откуда-то еще в проекте.Каждое сообщение / трансляция должна отправляться как реакция на полученное сообщение (насколько я понимаю).
Я пытался понять это, поэтому я пытался транслировать сообщение каждый раз, когда кто-то посещает страницу индекса:
@flask_app.route('/')
def index():
chat_application = ChatApplication()
chat_application.broadcast("A new user on the page!")
return render_template('index.html')
Это приводит к ошибке:
chat_application = ChatApplication()
TypeError: __init__() missing 1 required positional argument: 'ws'
Короче говоря: я не знаю, как отправить сообщение каждому клиенту через веб-сокет, так как мне нужен экземпляр ChatApplication для доступа к функции трансляциии я не могу понять, как создать объект ChatApplication, чтобы позволить мне вызывать эту функцию.