電子書籍反対派の僕でしたが、電子書籍しかない本に出会ってしかたなく電子書籍買いました。
ってことで概説Tornadoを読んでます。
UIモジュールの章を読んでて、コピペで試したらうまく行きませんでした。
Kouki-2:books kouki$ python hello_module.py Traceback (most recent call last): File "hello_module.py", line 23, in <module> ui_modules={'Hello', HelloModule} File "/Library/Python/2.7/site-packages/tornado/web.py", line 1512, in __init__ self._load_ui_modules(settings.get("ui_modules", {})) File "/Library/Python/2.7/site-packages/tornado/web.py", line 1629, in _load_ui_modules assert isinstance(modules, dict) AssertionError
こんな感じでAssertionError
なんでかなー、って思ってエラー確認するとui_modulesの指定でおかしくなってるらしい。
本出た時のバージョンと今のバージョンではui_modulesの指定方法違うのかな?って思ってui_moduleについて調べました。
すると、ここでは、本と違う呼び出し方をしてました。だけどこれって本質的な違いじゃないよなー。って思いつつもう一度ソースコードを見直すと
if __name__ == '__main__': tornado.options.parse_command_line() app = tornado.web.Application( handlers=[(r'/', HelloHandler)], template_path=os.path.join(os.path.dirname(__file__), 'templates'), ui_modules={'Hello', HelloModule} #ここでエラーが起きてる ) server = tornado.httpserver.HTTPServer(app) server.listen(options.port) tornado.ioloop.IOLoop.instance().start()
注目すべきはここです。
ui_modules={'Hello', HelloModule}
辞書渡すのが正しい構文ですが、ここでは区切り記号を","にしてしまっているため、set*1になってしまってます。
本来ならdictを渡したいので、","を":"に変えてあげて
if __name__ == '__main__': tornado.options.parse_command_line() app = tornado.web.Application( handlers=[(r'/', HelloHandler)], template_path=os.path.join(os.path.dirname(__file__), 'templates'), ui_modules={'Hello' : HelloModule} #dictを渡すように変更 ) server = tornado.httpserver.HTTPServer(app) server.listen(options.port) tornado.ioloop.IOLoop.instance().start()
こう1文字書き換えるだけで動くコードの出来上がりです。