我希望能够脱离上下文使用Flask请求。
我知道自Flask 0.10以来,有一个装饰器(@copy_current_request_context
)可以做到这一点,这就是我使用该装饰器来尝试和修改flask-socket的方法。特别是@socket.route
装饰器,它是 flask-socket 的一部分:
def route(self, rule, request, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
@copy_current_request_context
def do_some_work():
env = request.environ['wsgi.websocket']
self.add_url_rule(rule, endpoint, f,env, **options)
gevent.spawn(do_some_work)
return f
return decorator
虽然这产生的错误对我有意义 - 我假设有办法做我想做的事。:
RuntimeError: This decorator can only be used at local scopes when a
request context is on the stack. For instance within view functions.
我尝试将请求传递给装饰器,但那没有用。
为了提供更多上下文,我试图将request.environ['wsgi.websocket']
添加到Sockets对象内的一个dict中,以便能够访问ws
变量(我理解为请求环境)
在更高级别上,我希望能够从ws.send()
函数或视图以外的其他位置执行@route
- 也许是可以访问套接字对象实例的另一个线程。 / p>
我已经使用 Socket-IO 做了类似的事情 - socketio
对象就是send()
和recieve()
所需的全部内容数据 - 但是对于套接字,您似乎需要ws对象,即request.environ['wsgi.websocket']