Как украсить функции класса с помощью flask-socketio, если экземпляр socketIO является переменной-членом класса? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь создать пример приложения hello world для приложения-колбы с socketio, которое заключено в класс.

Я хочу обернуть все приложение в класс, который можно встроить в другие приложения. Для этого я создаю приложение Flask в конструкторе моего класса, а также создаю экземпляр SocketIO в качестве члена. Проблема в том, что я получаю исключение NameError, сообщающее мне, что '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 ]

1 голос
/ 10 июля 2019

Согласно документации, вы можете использовать ниже вместо декоратора

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')
1 голос
/ 10 июля 2019

Поскольку декорирование функции просто вызывает декоратор и передает декорированную функцию в качестве первого аргумента, который вы можете написать:

def __init__(self):
    ... 
    self.pongResponse = self.socketio.on('ping')(self._pongResponse)

def _pongResponse(self, message):
    ...

Метод, начинающийся с _, обозначает, что он не является частью общедоступного APIкласса (таким образом, это просто соглашение).Также обратите внимание, что в python вы должны использовать snake_case вместо camelCase для именования ваших функций и переменных, хотя это также просто соглашение.

...