我希望能够脱离上下文使用 Flask 请求。
我意识到从 Flask 0.10 开始就有一个 decorator( @copy_current_request_context
) 可以做到这一点,这就是我使用该装饰器来尝试修改flask-socket 的方式。特别是作为flask-sockets@socket.route
一部分的 装饰器:
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
——也许是另一个可以访问套接字对象实例的线程。
我已经用Socket-IO做了类似的事情——socketio
对象是你需要能够send()
和recieve()
数据的所有东西——但是对于 Sockets,你似乎需要 ws 对象,这是request.environ['wsgi.websocket']