tornado options


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)
...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM