4

我希望能够脱离上下文使用 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']

4

0 回答 0