安装

  • 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

代码解读

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为例,其原理如下图
  • 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)

初始 Tronado的更多相关文章

  1. 2DToolkit官方文档中文版打地鼠教程(一):初始设置

    这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...

  2. CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总

    CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总 开始 总的来说,OpenGL应用开发者会遇到为如下三种数据创建Vertex Buffer Object的情形: ...

  3. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  4. linux系统下使用xampp 丢失mysql root密码【xampp的初始密码为空】

    如果在ubuntu 下面 使用xampp这个集成开发环境,却忘记mysql密码. 注:刚安装好的xampp的Mysql初始密码是空... 找回密码的步骤如下: 1.停止mysql服务器 sudo /o ...

  5. python基础之初始python

    初始python之基础一 一.Python 介绍 1.python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发 ...

  6. openfire 初始密码

    openfire 初始密码 mssql2014 进入数据库,找到 ofUser 表 ,将密码字段对应的密文替换为下面的内容,则密码就是 admin ecbd03623cd819c48718db1b27 ...

  7. Bash 什么时候会给 HOME 赋初始值

    今天无意发现下面这个表现: $  env -i bash -c cd bash: line 0: cd: HOME not set $ env -i bash -c 'echo $HOME' 这表明了 ...

  8. Holt-Winters原理和初始值的确定

      关于模型 (来自以下PPT,从第4页开始)   关于初始值: 以下文档给出了三个模型的初始值计算的思路. 大致思路如下,建立一个p阶移动平均模型,估计出参数即为初始值,具体的根据三种不同的模型,有 ...

  9. 关于int,integer初始值问题

随机推荐

  1. B.Beautiful Numbers

    题意:你被给予了一个序列 p = [p1, p2, ..., pn](1 ~ n的整数),如果存在l, r左右端点(1 <= l <= r <= n),使得[pl, pl+1,... ...

  2. Grafana基础

    一.Grafana基础 Grafana是一个开源的指标量监测和可视化工具.官方网站为:https://grafana.com/, 常用于展示基础设施的时序数据和应用程序运行分析.Grafana的das ...

  3. 使用Spring Boot和AspectJ实现方法跟踪基础结构

    了解如何使用Spring Boot和AspectJ实现方法跟踪基础结构!最近在优锐课学习收获颇多,记录下来大家一起进步! 在我们的应用程序中,获取方法的堆栈跟踪信息可能会节省很多时间.具有输入输出参数 ...

  4. 【Webpack】320- Webpack4 入门手册(共 18 章)(下)

    介绍 1. 背景 最近和部门老大,一起在研究团队[EFT - 前端新手村]的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平. 本文也是属于[E ...

  5. pyplot概述

            matplotlib.pyplot 是命令行风格的函数集,让matplotlib看起来像MATLAB.Each一样工作.pyplot函数能够对画布(figure)进行一些改变,例如:创 ...

  6. 服务网格数据平面的关键:层层剖析Envoy配置

    Envoy是一种高性能C++分布式代理,专为单个服务和应用程序设计.作为Service Mesh中的重要组件,充分理解其配置就显得尤为重要.本文列出了使用Envoy而不用其他代理的原因.并给出了Env ...

  7. 咪咕音乐链接歌词封面搜索等接口API

    搜索 pd.musicapp.migu.cn/MIGUM2.0/v1.0/content/search_all.do?&ua=Android_migu&version=5.0.1&am ...

  8. java基础- 你真的了解运算符吗?

    一 前言 学习java运算符的基础是你对数学和计算机原理有一定的要求,如果文章中有些位运算不懂是生么意思,我建议大家去学习一下计算机原理,计算机组成类别的书籍,你也不用深入过多,只要了解计算机大概结构 ...

  9. 2016/11/10 kettle概述

    ETL(Extract-Transform-Load,即抽取,转换,加载),数据仓库技术,是用来处理将数据从来源(以前做的项目)经过抽取,转换,加载到达目的端(正在做的项目)的过程.也就是新的项目需要 ...

  10. DHCP服务相关实验

    一.DHCP 相关介绍 1.dhcp服务相关 软件名: dhcp #DHCP服务软件包 dhcp-common #DHCP命令软件包(默认已安装) 服务名: dhcpd #DHCP服务名 dhcrel ...