tornado-day181219 走通tornado流程 和 tornado的options

近期开始看tornado,接手公司web项目. 今天下午github不知何故.卡顿连不上. 整理基础知识在此. 

一.安装测试

pip安装tornado

测试tornado是否安装成功,基础示例 . 启动tornado.web实例. 监听端口 访问返回字符串



import tornado.web
import tornado.ioloop

#类比django中的视图   习惯用法加上Handler
class IndexHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('Hsingpu is a good man')
    def post(self, *args, **kwargs):
        pass


if __name__ == '__main__':
    #实例化应用对象   Application: 是tornado web框架的核心应用类 ,是与服务器对应的接口 里面保存了路由映射表
    #有一个listen方法创建了一个http服务器示例 并绑定了端口
    app = tornado.web.Application([
        (r"/",IndexHandler)
    ])
    app.listen(8000)
    '''IOLoop.current()
    返回当前线程的IOLoop实例
    .start():启动IOLoop实例的I/O循环
    '''
    tornado.ioloop.IOLoop.current().start()

二.HTTPserver

更换app.listen()方式启动.  实例化一个HTTPserver来启动.



import tornado.web
import tornado.ioloop
import tornado.httpserver
#类比django中的视图   习惯用法加上Handler
class IndexHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('Hsingpu is a good man')
    def post(self, *args, **kwargs):
        pass


if __name__ == '__main__':
    #实例化应用对象   Application: 是tornado web框架的核心应用类 ,是与服务器对应的接口 里面保存了路由映射表
    #有一个listen方法创建了一个http服务器示例 并绑定了端口
    app = tornado.web.Application([
        (r"/",IndexHandler)
    ])
    #app.listen(8000)
    #实例化一个http服务器对象 并 绑定端口
    httpServer=tornado.httpserver.HTTPServer(app)
    httpServer.listen(8000)
    '''IOLoop.current()
    返回当前线程的IOLoop实例
    .start():启动IOLoop实例的I/O循环
    '''
    tornado.ioloop.IOLoop.current().start()

三.增加多线程启动方式

import tornado.web
import tornado.ioloop
import tornado.httpserver
#类比django中的视图   习惯用法加上Handler
class IndexHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('Hsingpu is a good man')
    def post(self, *args, **kwargs):
        pass


if __name__ == '__main__':
    #实例化应用对象   Application: 是tornado web框架的核心应用类 ,是与服务器对应的接口 里面保存了路由映射表
    #有一个listen方法创建了一个http服务器示例 并绑定了端口
    app = tornado.web.Application([
        (r"/",IndexHandler)
    ])
    #app.listen(8000)   #方法一    单进程模式
    #实例化一个http服务器对象 并 绑定端口
    httpServer=tornado.httpserver.HTTPServer(app)
    #httpServer.listen(8000)   #方法二  方法二拆分为下面方法三
    httpServer.bind(8000)
    httpServer.start(5)         #指定进程数 如为None或者小于等于0则根据cpu核心数进行创建
    '''IOLoop.current()
    返回当前线程的IOLoop实例
    .start():启动IOLoop实例的I/O循环
    '''
    tornado.ioloop.IOLoop.current().start()

但是  

'''
不用上述方式启动的问题   问题一:每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop,会
影响所有的子进程
2.所有的进程都是由一个命令启动的(python  server.py),无法做到在不停止服务的情况下修改代码.
3.所有进程共享一个端口,想要分别监控很困难
'''

四 . tornado的options  

创建2个tornado.options.define  并调用



import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
#1.基础方法  定义2个参数

tornado.options.define(name="port",default=8000,type=int,help="This is a port",
                       metavar=None,multiple=False,group=None,callback=None)
'''
type     变量类型 从命令行或配置导入参数值  如果没有设置type,则按default的类型.如果没有default,则不转换
multiple 设置选项变量是否为多个值,默认为False(比如传列表)
help     变量的提示信息,一般不用
'''
tornado.options.define('list',default=[],type=str,multiple=True)

#2.属性   全局的options对象,所有定义的选项变量都会作为该对象的属性
tornado.options.options

#3.获取参数的方法  转换命令行参数
#tornado.options.parse_command_line()

class IndexHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('Hsingpu is a good man')
    def post(self, *args, **kwargs):
        pass


if __name__ == '__main__':
    tornado.options.parse_command_line()  #转换2个参数并保存到tornado.options.options 下面可以使用变量的值
    print('list=',tornado.options.options.list)
    app = tornado.web.Application([
        (r"/",IndexHandler)
    ])

    httpServer=tornado.httpserver.HTTPServer(app)

    httpServer.bind(tornado.options.options.port)
    httpServer.start(1)
    tornado.ioloop.IOLoop.current().start()

以上代码可以用命令行传入参数   python  server04.py  --port=7890 --list=wo,ni    --logging=None

五.使用配置文件方式

新建文件config

port = 7000
list = ['new','current','old']

从文件中读取配置 

tornado.options.parse_config_file


import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
#1.基础方法  定义2个参数

tornado.options.define(name="port",default=8000,type=int,help="This is a port",
                       metavar=None,multiple=False,group=None,callback=None)
'''
type     变量类型 从命令行或配置导入参数值  如果没有设置type,则按default的类型.如果没有default,则不转换
multiple 设置选项变量是否为多个值,默认为False(比如穿列表)
help     变量的提示信息,一般不用
'''
tornado.options.define('list',default=[],type=str,multiple=True)

#2.属性   全局的options对象,所有定义的选项变量都会作为该对象的属性
tornado.options.options

#3.获取参数的方法  转换命令行参数
#tornado.options.parse_command_line()

class IndexHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('Hsingpu is a good man')
    def post(self, *args, **kwargs):
        pass


if __name__ == '__main__':
    tornado.options.options.logging = None
    tornado.options.parse_config_file(path='config')  #从配置文件读取

    print('list=',tornado.options.options.list)
    app = tornado.web.Application([
        (r"/",IndexHandler)
    ])

    httpServer=tornado.httpserver.HTTPServer(app)

    httpServer.bind(tornado.options.options.port)
    httpServer.start(1)
    tornado.ioloop.IOLoop.current().start()

#不建议使用以上方式, 因为书写格式仍然需要安装python的语法要求  2.不支持字典类型
#最终版本 创建一个名为config.py的普通文件,当做模块来用

 

六 最终版本 创建config.py模块 从模块中读取配置 

config.py文件内容

# 参数

options = {
    "port": 8080,
    "list": ['year', 'month', 'day']
}

示例代码   导入config模块,读取其中的配置内容



import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
import config


class IndexHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('Hsingpu is a good man')
    def post(self, *args, **kwargs):
        pass


if __name__ == '__main__':
#直接调用配置文件中
    print('list=',config.options['list'])
    app = tornado.web.Application([
        (r"/",IndexHandler)
    ])

    httpServer=tornado.httpserver.HTTPServer(app)
#直接调用配置文件中的
    httpServer.bind(config.options['port'])
    httpServer.start(1)
    tornado.ioloop.IOLoop.current().start()

 

总结:

启动有三种方式

1.    

app.listen(8000)

2.

#实例化一个http服务器对象 并 绑定端口
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.listen(8000)

3.

#实例化一个http服务器对象 并 绑定端口
httpServer=tornado.httpserver.HTTPServer(app)
#httpServer.listen(8000)   #方法二  方法二拆分为下面方法三
httpServer.bind(8000)
httpServer.start(5)         #指定进程数 如为None或者小于等于0则根据cpu核心数进行创建

二.tornado.options

读取配置三种方式

1.tornado.options.define定义

#tornado.options.parse_command_line()

 

2或从配置文件读取

tornado.options.parse_config_file(path='config')  #从配置文件读取

3或者创建模块 导入模块之间读取

httpServer.bind(config.options['port'])

三.日志处理

命令行传参关闭

python  server04.py  --port=7890 --list=['wo','ni']  --logging=None
 

代码关闭

tornado.options.options.logging = None

 

 

tornado的IOLoop调用epoll

高效:epoll管理socket 还有异步 

tornado-day181219 走通tornado流程 和 tornado的options_第1张图片

你可能感兴趣的:(Python,web框架)