TornadoのApplicationRouterで例外が出たら
tornado.testingでの単体テスト中、ドツボにハマったのでメモ。
Failure Traceback (most recent call last): """前略""" line 62, in create_app app = Application(handlers, debug=debug) File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/web.py", line 1910, in __init__ self.wildcard_router = _ApplicationRouter(self, handlers) File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/web.py", line 1785, in __init__ super(_ApplicationRouter, self).__init__(rules) File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/routing.py", line 363, in __init__ super(ReversibleRuleRouter, self).__init__(rules) File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/routing.py", line 288, in __init__ self.add_rules(rules) File "/home/nyanmao/python35_vir_env/lib/python3.5/site-packages/tornado/routing.py", line 298, in add_rules assert len(rule) in (2, 3, 4) AssertionError
_ApplicationRouter
コンストラクタ呼び出しがトレースバック途中にあり、assert len(rule) in (2, 3, 4)
の例外によって動作が止まったら、
Application
コンストラクタに渡している引数handlerが正しいか確認する。
自分は、ルーティング先の次にRequestHandlerを継承したクラスを格納することを忘れていた。
from tornado.web import Application, RequestHandler class MyRequestHandler(RequestHandler): # 中略 app = Application([ ( r'/api/v0/spam', MyRequestHandler, # これ ) ])
なぜドツボにはまったのかというと、ResourceWarning:
でFileやsocketが閉じられてない、ないしは使い尽くしているともでるので、そっちの線をずっと探っていたから。
ああ、情けない。