Ho risolto passando l'app come argomento alla classe e usando il contesto come suggerito dalla descrizione dell'errore, ma è necessario anche lo spazio dei nomi:
class Listener(threading.Thread):
def __init__(self, r, channels, app):
threading.Thread.__init__(self)
self.daemon = True
self.redis = r
self.pubsub = self.redis.pubsub()
self.pubsub.psubscribe(channels)
self.app = app
def work(self, item):
with app.app_context():
if isinstance(item['data'], bytes):
try:
msg = item['data'].decode('utf-8')
decode_msg = json.loads(msg)
if decode_msg['type'] == 'UPDATE_TASK':
send(json.dumps({"type":"UPDATE_TASK"}), room='home', namespace='/')
#_send_task_message()
except ValueError as e:
log.error("Error decoding msg to microservice: %s", str(e))
def run(self):
for item in self.pubsub.listen():
self.work(item)
if __name__ == '__main__':
r = redis.Redis()
client = Listener(r, ['/bobguarana/socketio'], app)
client.start()
socketio.run(debug=True, app=app, port=8080)