【发布时间】:2018-12-25 21:03:37
【问题描述】:
我的目标是在每个 websocket 请求初始化之前验证访问令牌。为此,我需要调用我的 oauth 服务器。所以试图添加一个中间件来检查访问令牌。我在这个链接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:从未等待协程“中间件”
self.request_callback(self.request)
问题
如何添加异步中间件?
或者我应该对 oauth 服务器进行同步调用吗?
或者还有其他地方我应该检查访问令牌吗?
【问题讨论】:
-
HTTPServer类调用中间件就像一个同步函数。您必须通过继承来创建自己的服务器类,然后使用await调用中间件。它可能有效,也可能无效,我还不确定。 -
感谢您的回复。我明白你在说什么,但不知道该怎么做。如果我创建一个自定义服务器,那么它本身就可以像中间件一样工作。对?无法弄清楚如何在同步过程中挂钩异步方法。
标签: python tornado middleware