tornado.options.define()
用來定義options選項變量的方法,定義的變量可以在全局的tornado.options.options中獲取使用,傳入參數:
- name 選項變量名,須保證全局唯一性,否則會報“Option 'xxx' already defined in ...”的錯誤;
- default 選項變量的默認值,如不傳默認為None;
- type 選項變量的類型,從命令行或配置文件導入參數的時候tornado會根據這個類型轉換輸入的值,轉換不成功時會報錯,可以是str、float、int、datetime、timedelta中的某個,若未設置則根據default的值自動推斷,若default也未設置,那么不再進行轉換。可以通過利用設置type類型字段來過濾不正確的輸入。
- multiple 選項變量的值是否可以為多個,布爾類型,默認值為False,如果multiple為True,那么設置選項變量時值與值之間用英文逗號分隔,而選項變量則是一個list列表(若默認值和輸入均未設置,則為空列表[])。
- help 選項變量的幫助提示信息,在命令行啟動tornado時,通過加入命令行參數 --help 可以查看所有選項變量的信息(注意,代碼中需要加入tornado.options.parse_command_line())。
tornado.options.options
全局的options對象,所有定義的選項變量都會作為該對象的屬性。
tornado.options.parse_command_line()
轉換命令行參數,並將轉換后的值對應的設置到全局options對象相關屬性上。追加命令行參數的方式是--myoption=myvalue
新建opt.py,我們用代碼來看一下如何使用:
# coding:utf-8 import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options # 新導入的options模塊 tornado.options.define("port", default=8000, type=int, help="run server on the given port.") # 定義服務器監聽端口選項 tornado.options.define("itcast", default=[], type=str, multiple=True, help="itcast subjects.") # 無意義,演示多值情況 class IndexHandler(tornado.web.RequestHandler): """主路由處理類""" def get(self): """對應http的get請求方式""" self.write("Hello Itcast!") if __name__ == "__main__": tornado.options.parse_command_line() print tornado.options.options.itcast # 輸出多值選項 app = tornado.web.Application([ (r"/", IndexHandler), ]) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(tornado.options.options.port) tornado.ioloop.IOLoop.current().start()
執行如下命令開啟程序:
$ python opt.py --port=9000 --itcast=python,c++,java,php,ios
tornado.options.parse_config_file(path)
從配置文件導入option,配置文件中的選項格式如下:
myoption = "myvalue" myotheroption = "myothervalue"
我們用代碼來看一下如何使用,新建配置文件config,注意字符串和列表按照python的語法格式:
port = 8000 itcast = ["python","c++","java","php","ios"]
修改opt.py文件:
# coding:utf-8 import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options # 新導入的options模塊 tornado.options.define("port", default=8000, type=int, help="run server on the given port.") # 定義服務器監聽端口選項 tornado.options.define("itcast", default=[], type=str, multiple=True, help="itcast subjects.") # 無意義,演示多值情況 class IndexHandler(tornado.web.RequestHandler): """主路由處理類""" def get(self): """對應http的get請求方式""" self.write("Hello Itcast!") if __name__ == "__main__": tornado.options.parse_config_file("./config") # 僅僅修改了此處 print tornado.options.options.itcast # 輸出多值選項 app = tornado.web.Application([ (r"/", IndexHandler), ]) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(tornado.options.options.port) tornado.ioloop.IOLoop.current().start()
說明
1. 日志
當我們在代碼中調用parse_command_line()或者parse_config_file()的方法時,tornado會默認為我們配置標准logging模塊,即默認開啟了日志功能,並向標准輸出(屏幕)打印日志信息。
如果想關閉tornado默認的日志功能,可以在命令行中添加--logging=none 或者在代碼中執行如下操作:
from tornado.options import options, parse_command_line options.logging = None parse_command_line()
2. 配置文件
我們看到在使用prase_config_file()的時候,配置文件的書寫格式仍需要按照python的語法要求,其優勢是可以直接將配置文件的參數轉換設置到全局對象tornado.options.options中;然而,其不方便的地方在於需要在代碼中調用tornado.options.define()來定義選項,而且不支持字典類型,故而在實際應用中大都不使用這種方法。
在使用配置文件的時候,通常會新建一個python文件(如config.py),然后在里面直接定義python類型的變量(可以是字典類型);在需要配置文件參數的地方,將config.py作為模塊導入,並使用其中的變量參數。
如config.py文件:
from tornado.options import options, parse_command_line options.logging = None parse_command_line()
2. 配置文件
我們看到在使用prase_config_file()的時候,配置文件的書寫格式仍需要按照python的語法要求,其優勢是可以直接將配置文件的參數轉換設置到全局對象tornado.options.options中;然而,其不方便的地方在於需要在代碼中調用tornado.options.define()來定義選項,而且不支持字典類型,故而在實際應用中大都不使用這種方法。
在使用配置文件的時候,通常會新建一個python文件(如config.py),然后在里面直接定義python類型的變量(可以是字典類型);在需要配置文件參數的地方,將config.py作為模塊導入,並使用其中的變量參數。
如config.py文件:
# conding:utf-8 # Redis配置 redis_options = { 'redis_host':'127.0.0.1', 'redis_port':6379, 'redis_pass':'', } # Tornado app配置 settings = { 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), 'static_path': os.path.join(os.path.dirname(__file__), 'statics'), 'cookie_secret':'0Q1AKOKTQHqaa+N80XhYW7KCGskOUE2snCW06UIxXgI=', 'xsrf_cookies':False, 'login_url':'/login', 'debug':True, } # 日志 log_path = os.path.join(os.path.dirname(__file__), 'logs/log')
使用config.py的模塊中導入config,如下:
# conding:utf-8 import tornado.web import config if __name__ = "__main__": app = tornado.web.Application([], **config.settings) ...