龙卷风中的异步中间件
Async middleware in tornado
我的目标是在每个 websocket 请求初始化之前验证访问令牌。为此,我需要调用我的 oauth 服务器。因此尝试添加一个中间件来检查访问令牌。我发现如何在此 link https://github.com/tornadoweb/tornado/issues/49 中添加中间件,效果很好。但问题是,当我调用我的 oauth 服务器时,我正在异步执行它,而且中间件似乎不能是异步的。这是我的示例代码
app = Application()
async def middleware(request):
userToken = request.headers.get('Authorization')
active = await check_accesstoken(userToken)
if not active:
return error
app(request)
async def check_accesstoken(userToken):
http_client = httpclient.AsyncHTTPClient()
post_data = {'token': userToken, 'scope': 'email phone'}
api_endpoint = 'https://192.168.0.4:1445/oauth2/introspect'
json_data = json.dumps(post_data)
response = await http_client.fetch(api_endpoint,
raise_error=False,
method='POST',
body=json_data
# headers=headers
)
return response.body.active:
def main():
http_server = tornado.httpserver.HTTPServer(middleware)
http_server.listen(PORT, HOST)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()
出现以下错误。
RuntimeWarning: coroutine 'middleware' was never awaited
self.request_callback(self.request)
问题
如何添加一个aync中间件?
或者我应该同步调用 oauth 服务器吗?
或者还有其他我应该检查访问令牌的地方吗?
是的,重写起来麻烦多过值得HTTPServer
。
想到的一个更明智的解决方案是您可以子类化 RequestHandler
并在该子类上创建一个 prepare()
方法,您可以在其中检查访问令牌。
然后从该子类创建所有处理程序。这是一个例子:
class BaseHandler(web.RequestHandler):
async def prepare(self):
active = await check_accesstoken(userToken)
if not active:
self.write("Error")
self.finish()
class SomeHandler(BaseHandler):
...
如果您还需要在处理程序上创建 prepare()
方法,只需使用 super()
调用 BaseHandler
的 prepare
。
我的目标是在每个 websocket 请求初始化之前验证访问令牌。为此,我需要调用我的 oauth 服务器。因此尝试添加一个中间件来检查访问令牌。我发现如何在此 link https://github.com/tornadoweb/tornado/issues/49 中添加中间件,效果很好。但问题是,当我调用我的 oauth 服务器时,我正在异步执行它,而且中间件似乎不能是异步的。这是我的示例代码
app = Application()
async def middleware(request):
userToken = request.headers.get('Authorization')
active = await check_accesstoken(userToken)
if not active:
return error
app(request)
async def check_accesstoken(userToken):
http_client = httpclient.AsyncHTTPClient()
post_data = {'token': userToken, 'scope': 'email phone'}
api_endpoint = 'https://192.168.0.4:1445/oauth2/introspect'
json_data = json.dumps(post_data)
response = await http_client.fetch(api_endpoint,
raise_error=False,
method='POST',
body=json_data
# headers=headers
)
return response.body.active:
def main():
http_server = tornado.httpserver.HTTPServer(middleware)
http_server.listen(PORT, HOST)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()
出现以下错误。
RuntimeWarning: coroutine 'middleware' was never awaited
self.request_callback(self.request)
问题
如何添加一个aync中间件?
或者我应该同步调用 oauth 服务器吗?
或者还有其他我应该检查访问令牌的地方吗?
是的,重写起来麻烦多过值得HTTPServer
。
想到的一个更明智的解决方案是您可以子类化 RequestHandler
并在该子类上创建一个 prepare()
方法,您可以在其中检查访问令牌。
然后从该子类创建所有处理程序。这是一个例子:
class BaseHandler(web.RequestHandler):
async def prepare(self):
active = await check_accesstoken(userToken)
if not active:
self.write("Error")
self.finish()
class SomeHandler(BaseHandler):
...
如果您还需要在处理程序上创建 prepare()
方法,只需使用 super()
调用 BaseHandler
的 prepare
。