我正在尝试从侦听器中访问当前的应用程序,以便可以使用要订阅哪个频道的app config值。但是我收到“RuntimeError:在应用程序上下文之外工作”。在
以下是相关代码:
from flask import Blueprint, Response, request, current_app
from socketio import socketio_manage
from socketio.namespace import BaseNamespace
from redis import StrictRedis
import pprint
socketapp = Blueprint('socketapp', __name__)
class MessageNamespace(BaseNamespace):
def listener(self):
pprint.pprint(current_app.config)
r = StrictRedis()
p = r.pubsub()
p.subscribe('message-channel')
messages = r.lrange('message', 0, -1)
self.emit('message-message', ''.join(messages))
for m in p.listen():
if m['type'] == 'message':
self.emit('message-message', m['data'])
def on_subscribe(self):
self.spawn(self.listener)
@socketapp.route('/socket.io/<path:remaining>')
def socketio(remaining):
try:
socketio_manage(request.environ, {'/messages': MessageNamespace}, request)
except BaseException:
pass
return Response()
@socketapp.route('/message', methods=['GET'])
def say():
msg = request.args.get('msg', None)
if msg:
r = StrictRedis(host=current_app.config['REDIS_HOST'])
r.rpush('message', msg)
r.publish('message-channel', msg)
return Response('Message sent!')
else:
return Response('Please specify your message in the "msg" parameter')
current_app
只有在处理HTTP请求时才有效(它是一个临时指向实际应用程序对象的代理)。您需要从这个模块访问实际的app对象,或者通过current_app._get_current_object()
窃取对它的引用。在肖恩的片段对我不起作用。基于此,我写了以下的黑客:
相关问题 更多 >
编程相关推荐