Tornadoを使ってみる

Command-line parsing


TornadoのCommand-line parsingを使えば、実行時の引数でoptionの値を変えることができます。
Command-line parsingについてはこちらに詳 しい説明が有ります。
例えば、テスト時とリリース時で値を変えることができますので、かなり便利です。



以下のスクリプトを引数無しで実行します。
#
# Command-line parsing
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
define("nopnop2002", default="/tmp", help="run on the given directory", type=str, metavar="PATH")

class Application(tornado.web.Application):
    def __init__(self):
        print("port={}".format(options.port))
        print("nopnop2002={}".format(options.nopnop2002))
        handlers = [
            (r"/", IndexHandler),
        ]
        settings = dict(
            debug=True,
            )
        tornado.web.Application.__init__(self, handlers, **settings)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        param = self.get_argument('param', 'Hello World')
        self.write(param)

if __name__ == "__main__":
    tornado.options.parse_command_line()
    #app = tornado.web.Application(handlers=[(r"/", IndexHandler)],debug=True)
    #app = tornado.web.Application([(r"/", IndexHandler)],debug=True)
    app = Application()
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

portとnopnop2002はデフォルトの値となります。




--nopnop2002の引数付きでスクリプトを起動すると、nopnop2002の値が変わります。




--helpの引数付きでスクリプトを起動すると、optionの一覧を表示します。




こちらの ドキュメントに以下の記載が有ります。

Dashes and underscores are fully interchangeable in option names;
options can be defined, set, and read with any mix of the two.
Dashes are typical for command-line usage while config files require underscores.

オプションの名前に「_」(アンダースコアー)が含まれている場合、アンダースコアー(_)はダッシュ(-)に置き換えられます。
#
# Command-line parsing
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
define("nop_nop2002", default="/tmp", help="run on the given directory", type=str, metavar="PATH")

(以下省略)



起動時に指定する名前は「nop-nop2002」ですが、スクリプト内では「nop_nop2002」で参照します。




parse_config_file()を使うと、optionの値をファイル(server.conf)に定義することができます。
#
# Command-line parsing
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
define("nopnop2002", default="/tmp", help="run on the given directory", type=str)
define("memcache_hosts", default="127.0.0.1:11011", multiple=True,
       help="Main user memcache servers")

class Application(tornado.web.Application):
    def __init__(self):
        print("port={}".format(options.port))
        print("nopnop2002={}".format(options.nopnop2002))
        print("memcache_hosts={}".format(options.memcache_hosts))
        handlers = [
            (r"/", IndexHandler),
        ]
        settings = dict(
            debug=True,
            )
        tornado.web.Application.__init__(self, handlers, **settings)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        param = self.get_argument('param', 'Hello World')
        self.write(param)

if __name__ == "__main__":
    #tornado.options.parse_command_line()
    tornado.options.parse_config_file("server.conf")
    #app = tornado.web.Application([(r"/", IndexHandler)],debug=True)
    app = Application()
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

server.confはスクリプトと同じフォルダーに以下の内容で定義します。
multiple=Trueのオプションについては、リストも定義することができます。
nopnop2002 = '/home'

# multiple=True.
memcache_hosts = ['cache1.example.com:11011',
                  'cache2.example.com:11011']

server.confが有ると、何も引数を指定しなくてもoptionの値 が変わります。




configオプションを使うと、--configでconfigファイルを指定することができます。
#
# Command-line parsing
#
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
define("nopnop2002", default="/tmp", help="run on the given directory", type=str)
define("memcache_hosts", default="127.0.0.1:11011", multiple=True,
       help="Main user memcache servers")
define("config", type=str, help="path to config file",
       callback=lambda path: options.parse_config_file(path, final=False))


class Application(tornado.web.Application):
    def __init__(self):
        print("nopnop2002={}".format(options.nopnop2002))
        print("memcache_hosts={}".format(options.memcache_hosts))
        handlers = [
            (r"/", IndexHandler),
        ]
        settings = dict(
            debug=True,
            )
        tornado.web.Application.__init__(self, handlers, **settings)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        param = self.get_argument('param', 'Hello World')
        self.write(param)

if __name__ == "__main__":
    tornado.options.parse_command_line()
    #tornado.options.parse_config_file("server.conf")
    #app = tornado.web.Application([(r"/", IndexHandler)],debug=True)
    app = Application()
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

引数無しで起動するとデフォルト値が使われます。


--configでconfigファイルを指定すると、ファイル内の値が使われます。


別のconfigファイルを指定すると、値が変わります。
一時的に環境を変えたいときに大変便利です。


続く...