多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
一:tornado基础程序 (1):tornado第一个基础程序 ~~~ import tornado.ioloop tornado的核心iO循环模块,封装了linux的epoll和BSD的kqueue import tornado.web tornado的web基础框架模块 ~~~ ~~~ 视图业务处理类 class MainHandler(tornado.web.RequestHandler): //处理get请求的,不能处理post请求 def get(self): //对应http请求的方法 //给浏览器响应信息 self.write("Hello, world") ~~~ ~~~ 路由 def make_app(): //Application是tornado 的web框架的核心应用类,与服务器对应的接口 return tornado.web.Application([ //保存了路由映射表 (r"/", MainHandler), ]) ~~~ ~~~ if __name__ == "__main__": app = make_app()//实例化一个app对象 app.listen(80)//创建了一个http服务器,并绑定了端口 //IOLoop.current():返回当前线程的IOLoop实例 //IOLoop.start():启动IOLoop实例的I/O循环,同时开启了监听 tornado.ioloop.IOLoop.current().start() ~~~ (2):tornado高性能原理图 ![](https://img.kancloud.cn/98/5d/985dda937eea6c615b97a188422c5b9a_821x584.png) 二:httpserver (1):httpserver对象 ``` app.listen(80)替换为: import tornado.httpsever//需要引入httpserver模块 //实例化一个http服务器对象 httpServer=tornado.httpserver.HTTPServer(app) httpServer.listen(80)//绑定端口,此处listen()与app.listen()不是同一个方法 ``` (2)单进程与多进程 1.默认是单进程 2.代码实例 ``` import tornado.httpsever httpServer=tornado.httpserver.HTTPServer(app) httpServer.bind(80) httpServer.start(5) ``` 3.说明 httpServer.bind(80):将服务器绑定到指定的端口 httpServer.start(5):默认开启一个进程;值小于等于0或为None,开启对应服务器cpu核心数个子进程;值大于0则创建对应值个子进程 4.补充说明 app.listen(80)只能在单进程模式中使用 不建议使用上面的方法启动多进程,采用手动启动的方式,即python index.py 原因: 1.每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop,会影响所有的子进程 2.所有的进程都是由一个命令启动的,无法做到在不停止服务的情况下修改代码 3.所有的进程共享一个端口,想分别监控很困难 三:options----需要引入options模块---import tornado.options (1):tronado为我们提供了一个tornado.options模块,可以进行全局参数的定义,存储,转换 (2)基础方法与属性 1.tornado.options.difine() ``` 原型: tornado.options.define(name='',default=None,type=None,help=None,metavar=None,multiple=False,group=None,callback=None) 功能:用来定义options选项变量的方法 参数: #name:选项变量名,必须保证其唯一性,否则会报‘option xxx alerady define in ...’ #default:设置选项变量的默认值,默认None #type: 1.设置选项变量的类型,从命令行或配置文件导入参数时会根据类型转换输入的值,转换不成会报错,可以是str,int,float... 2.如果没有设置type,会根据default的值进行转换 3.如果default没有设置,那么不进行转换 #multiple:设置选项变量是否可以多个值,默认False #help;选项变量的帮助提示信息 事例: tornado.options.define('port',default=80,type=int) tornado.options.define('list',default=[],type=str) ``` 2.tornado.options.options --全局的options对象,所有定义的选项变量都会作为该对象的属性 ``` 示例:print(tornado.option.options.port) 结果为80(上面的端口号) 获取参数的方法: tornado.options.parse_command_line()转换命令行参数 例如Python index.py --port=80 --list=goods,picture,image 代码示例: ~~~ import tornado.ioloop import tornado.web import tornado.httpsever import tornado.options tornado.options.define('port',default=80,type=int) tornado.options.define('list',default=[],type=str) class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") tornado.options.parse_command_line() print("list=",tornado.options.options.list) def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() httpServer=tornado.httpserver.HTTPServer(app) httpServer.bind(tornado.options.options.port) httpServer.start() tornado.ioloop.IOLoop.current().start() ~~~ ``` ![](https://img.kancloud.cn/07/86/07862a07ad45ca1e3fb9c6ed30b0d0fe_549x74.png) ![](https://img.kancloud.cn/60/01/6001f8c0390e4ffe04c6cce4f9ceaed5_374x116.png) 3.tornado.options.parse_config_file(path) --从配置文件导入参数,创建的是普通文件 代码示例 ![](https://img.kancloud.cn/aa/d8/aad8a8c2ca76f541028db30eaaf89575_718x287.png) ![](https://img.kancloud.cn/7d/bd/7dbdc2fc1a9a17e496f3552d942d944b_488x456.png) 说明: 书写格式仍需按照python的语法要求,不支持字典类型 4.最终版本 --创建一个名为config.py的文件 代码示例: ![](https://img.kancloud.cn/de/d8/ded84ff32721b585e17a8ac881e6aa82_672x320.png) ![](https://img.kancloud.cn/7f/63/7f63c8a2dcd319459a1bc7e826ac707a_414x443.png) 5:日志 当我们在代码中使用parse_command_line()或者parse_config_file(path)方法时,tornado会默认开启logging模块功能,向屏幕终端输入一些打印信息 ~~~ 关闭日志--需要import tornado.options if __name__ == "__main__": tornado.options.options.logging=None//一定要显示在第一行,if下面 ~~~ ![](https://img.kancloud.cn/68/26/682638c3ca240094dcbf5efef9dbf18c_347x70.png)