欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

初始 Tronado

程序员文章站 2023-10-28 23:43:10
安装pip 安装pip install tronado手动安装下载tronado安装包(https://pypi.python.org/packages/source/t/tornado/tornado-替换版本号.tar.gz)tar xvzf tornado-4.3.tar.gzcd torna... ......

安装

  • pip 安装
pip install tronado
tar xvzf tornado-4.3.tar.gz
cd tornado-4.3
python setup.py build
sudo python setup.py install

tornado 的基本写法

新建hello_tornado.py文件

# coding:utf-8

import tornado.web
import tornado.ioloop

class indexhandler(tornado.web.requesthandler):
    """主路由处理类"""
    def get(self):
        """对应http的get请求方式"""
        self.write("hello tronado")

if __name__ == "__main__":
    app = tornado.web.application([
        (r"/", indexhandler),
    ])
    app.listen(8000)
    tornado.ioloop.ioloop.current().start()

执行以下命令,启动tronado

python hello_tornado.py

在浏览器中,输入地址:127.0.0.1:8000
初始 Tronado

代码解读

tornado.web

tornado的基础web框架模块

  • requesthandler
    封装了对应一个请求的所有的信息和方法,write(响应信息)就是想浏览器(前端)返回响应信息的一个方法;对应每一种http请求(get、post、put等),吧对应的处理逻辑写进同名的成员方法中(如对应get请求,就将对应的处理逻辑写在get()方法中),当没有对应的请求处理方法是(如浏览器发送get方法,而后端服务中无get()方法时),会返回“405: method not allowed”错误
  • application
    tronado web框架的核心应用类,是与服务器对接的接口,里面保存的路由表(请求路径表),期初始化接受的第一个参数就是路由信息映射的列表;listen(端口)方法用来创建一个htttp服务器市里,并绑定给定端口 ps:此时服务器并未开始监听 #####tornado.ioloop
    tornado的核心io循环模块,封装了linux的epollbsd的kqueue,tornado高性能的基石。
    以linux的epoll为例,其原理如下图 初始 Tronado
  • ioloop.current()
    返回当前线程的ioloop实例
  • ioloop.start()
    启动ioloop实例的i/o循环,同时服务器监听被打开
tornado web程序编写流程大致如下
  • 创建web应用实例对象,第一个初始化参数为路由映射列表。
  • 定义实现路由映射列表中的handler类。
  • 创建服务器实例,绑定服务器端口。
  • 启动当前线程的ioloop。

options

上述代码示例中,我们都是将服务端口的参数血丝在程序中的,很不灵活,而tornado为我们提供了一个便捷的工具---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 可以查看所有选项变量的信息(ps:代码中需要加入tornado.options.parse_command_line())。
tornado.options.options

全局的options对象,所以定义的选项变量都会作为该对象的属性

tornado.options.parse_command_line() 用法

转换命令行参数,并将转换后的值对应的设置到全局options对象相关属性上。追加命令行参数的方式是myoption=myvalue
示例:

新建demo_02.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("tornado", default=[], type=str, multiple=true, help="tornado subjects.") # 无意义,演示多值情况

class indexhandler(tornado.web.requesthandler):
    """主路由处理类"""
    def get(self):
        """对应http的get请求方式"""
        self.write("hello tornado!")

if __name__ == "__main__":
    tornado.options.parse_command_line()
    print(tornado.options.options.tornado)   # 输出多值选项
    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 demo_02.py --port=9000 --tornado=python,c++,java,php,ios
tornado.options.parse_config_file(path) 用法

我们用代码来看一下如何使用,新建配置文件config,注意字符串和列表按照python的语法格式:

port = 8000
tornado = ["python","c++","java","php","ios"]

将demo_02.py文件修改

...
if __name__ == "__main__":
    tornado.options.parse_config_file("./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')

然后在需要调用它的模块中添加

import config

if __name__ = "__main__":
    app = tornado.web.application([], **config.settings)