如果socketIO实例是类成员变量,如何用flask-socketio装饰类函数?

时间:2019-07-10 11:48:39

标签: python flask flask-socketio

我正在尝试为包装为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类作为成员的同时,如何装饰函数?

2 个答案:

答案 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')