Tornado初识
一、Tornado介绍
Tornado是Python 编写的一个强大的可扩展的Web服务器,在处理高网络流量的时候表现的足够强大,但是在创建的时候,和Flask类似又足够轻量,并且可以被用到大量的工具当中。相对于其他的框架,Tornado有如下特点:
1、完整的Web开发框架,和Django,Flask一样,Tornado也提供了路由映射,request上下文,基于模板的页面渲染这些功能
2、同样是一个高效的网络库,性能可以和Python 的Twisted,Gevent等底层框架媲美,同时提供了异步IO,超时事件处理,功能,这样twisted除了做Web之外还可以做爬虫,物联网关或者游戏服务器等后台应用
3、提供了高效的HTTPClient,除了服务器端框架,还提供了基于异步框架的HTTP客户端
4、提供了高效的内部服务器,Tornado的内部服务器可以直接用于生产环境
5、完备的WebSocket支持
Tornado是一个web框架和强大的服务器
二、Tornado安装
1、创建虚拟环境
conda create -n tornado_env python=3.7
2、安装tornado
pip install tornado==6.0.4
3、测试安装
import tornado
tornado.version
三、Tornado与路由
Tornado功能很强大,目前我们主要学习Tornado Web部分
四、Tornado入门案例
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
上面的代码实现了一个基本的get请求响应的案例。具体分析
1、tornado.ioloop类是负责Tornado进行io交互的基础类,在这里需要ioloop让脚本保持持续的监听
2、tornado.web类是负责Tornado Web开发的基础类,Web开发离不开他
3、tornado.web.requesthandler 这个类是Tornado负责处理请求的基础类,在类当中可以重写get,post,put,delete等方法,实现对不同类型的请求的响应
4、write方法是tornado.web.requestHandler的一个输出方法
5、tornado.web.Application 是Tornado Web应用需要的基础类,上面编写了处理请求的类,tornado.web.Application的目的就是Tornado内置服务器的类,用来运行项目,其中第一参数可以接收一个列表类型的路由表,这个路由表当中都是两元素元组,前面的元素是匹配,后面的元素是处理请求的类
6、app.listen设置访问监听的端口
7、启动io监听
Initialize() 改方法用于被字类重写,用于请求类初始化,如果有参数,需要在路由部分进行传递
prepare调用请求方法(get)之前执行
on_finish调用请求方法(get)之后执行
五、路由解析
Tornado 的路由配置和Django的类似,支持字符串和正则匹配,并且可以通过组匹配进行传参
规则如下:
1、路由可以用字符串匹配
2、路由可以用正则匹配
3、路由当中正则组匹配到的内容作为参数传递给视图函数
4、路由当中正则命名组配到的内容作为参数传递给视图函数对应名称参数
六、Tornado模板系统
Tornado有和Django,Flask类似的模板系统,也可以进行前端页面的加载和渲染
Tornado默认加载服务器根目录(启动文件目录)的HTML文件和静态文件,但是在项目开发过程当中,由于项目文件太多,如果涉及的静态文件太多会导致文件目录凌乱,所以需要进行HTML文件和静态文件的分离
在application当中,可以通过以下配置完成静态和HTML文件的设置
| 配置 | 含义 |
|---|---|
| template_path | 模板文件目录 |
| static_path | 静态文件目录 |
| static_url_prefix | 静态文件路由 |
七、Tornado模板语法
1、变量
| 调用方式 | 描述 |
|---|---|
| {{ name }} | 变量调用 |
| {{ name[1] }} | 变量索引取值 |
| {{ name[1:3] }} | 变量索引截取 |
| {{ name.upper() }} | 变量方法调用 |
| {{ name.replace("l","L") }} | 变量方法传参调用 |
2、标签
- 标签,结束标识不再是endif 而是end
| 调用方式 | 描述 |
|---|---|
| {% if result["arg_true"] %} true {% end %} |
布尔值比较判断 |
| {% if result["arg_number"] == 5 %} true {% end %} |
数字比较判断 |
| {% if result["arg_string"] == "laobian" %} true {% end %} |
字符比较串判断 |
| {% for car in car_list%} {{car["name"]}}-{{car.get("price")}} {{%end%}} | for循环遍历 |
3、模板继承和加载
- 继承
当我们浏览一个网站的时候发现里面的网页大部分都是相同的。这时候我们为了去除代码的冗余,可以使用继承
(1)、定义父模板,在父模板中使用block
(2)、定义子模板,继承父模板
{% extend "base.html" %}
{% block %}{% end %}
- 包含
可以将常用的页面内容如导航条,页尾信息等不变的组件可以保存在单独的文件中,然后在需要使用的地方按如下语法导入即可
{% include "base.html" %}
八、Tornado请求响应
| 方法 | 描述 |
|---|---|
| render | 加载页面 |
| redirect | 跳转页面 |
| write | 返回数据 |
| set_header | 设定响应头部 |