我正在尝试为包装为class的带有socketio的flask应用程序创建一个hello world示例。
我想将整个应用程序包装到一个类中,该类可以嵌入到其他应用程序中。为此,我将在类的构造函数中创建Flask应用程序,还将SocketIO实例也创建为成员。 问题是我收到NameError异常,告诉我未定义'socketio'。
我尝试从以下的最小工作示例中改编:flask-socketio教程(https://flask-socketio.readthedocs.io/en/latest/)
这是我要开始工作的示例代码:
from flask import Flask
from flask_socketio import SocketIO, emit
class ApplicationExample:
def __init__(self):
self.app = Flask(__name__)
self.socketio = SocketIO(self.app)
@socketio.on('ping')
def pongResponse(self, message):
emit('pong')
def run(self):
self.socketio.run(service.app, host='0.0.0.0')
if __name__ == '__main__':
service = ApplicationExample()
service.run()
我想将pongResponse函数绑定到类中的socketio实例。在将SocketIO类作为成员的同时,如何装饰函数?
答案 0 :(得分:1)
由于装饰函数只是调用装饰器,并将装饰的函数作为您可以编写的第一个参数传递:
def __init__(self):
...
self.pongResponse = self.socketio.on('ping')(self._pongResponse)
def _pongResponse(self, message):
...
以_
开头的方法表示该方法不属于该类的公共API(因此,这只是一个约定)。还要注意,在python中,您应该使用snake_case
而不是camelCase
来命名函数和变量,尽管这只是一个约定。
答案 1 :(得分:1)
根据文档,您可以使用以下内容代替装饰器
def my_function_handler(data):
pass
socketio.on_event('my event', my_function_handler, namespace='/test')
会变成类似
from flask import Flask
from flask_socketio import SocketIO, emit
class ApplicationExample:
def __init__(self):
self.app = Flask(__name__)
self.socketio = SocketIO(self.app)
self.socketio.on_event('ping', self.pongResponse, namespace='/test')
def pongResponse(self, message):
emit('pong')
def run(self):
self.socketio.run(service.app, host='0.0.0.0')