RequestHandler
的两个子类StaticFileHandler
,RedirectHandler
这个小节我们学习下RequestHandler
的两个子类。
首先学习下RedirectHandler
:
进行重定向
一般是在实例化app
的时候将一个不再使用的路由永久重定向到另一个路由。
1 | app = web.Application([ |
这里我们将/2/
的路由永久重定向到/
路由下。
看下RedirectHandler
的源码:
1 | class RedirectHandler(RequestHandler): |
我们看到默认情况下的permanent
设置为True
。
我们知道在RequestHandler
中也有一个重定向方法redirect
。
我们看下redirect
的源码:
1 |
|
redirect
主要是代码内部做临时重定向,如访问未登录的接口重定向到登录接口。
两者的区别:
一般RedirectHandler
的用在url
配置的时候做永久重定向。
redirect
一般写在业务逻辑中,根据业务逻辑决定是否需要重定向。
再看下StaticFileHandler
:
这个主要代理静态文件:html
,css
,js
,图片等。
我们可以使用初始化app
的时候修改配置来指定静态文件的访问格式。
1 | settings = { |
或者直接使用StaticFileHandler
:
1 | application = web.Application([ |
tornado的template
tornado
的模板渲染我们可以类比其他框架的,例如Flask
。
我们是可以直接返回一段html
文本
1 | self.finish("<h1>tornado</h1>") |
文本中可以传入变量
1 | word = "tornado" |
Web 框架都有模板功能
我们看下tornado
中的模板功能
1 | from tornado.web import template |
如果想渲染整个html
文件,需要使用render
函数、
1 | self.render("index.html", orders=orders) |
我们调用完render
就不要再调用writer
了,因为该函数最后调用了finish
上面的功能可以类比Flask
的模板渲染
1 | from flask import render_template |
和Flask
一样我们需要指定模板文件夹所在位置
1 | settings = { |
由购物车列表页学习 template
常用功能
首先看下模板中的静态文件的引用
我们通过配置
static_path
指定了静态文件的位置,static_url_prefix
指定静态文件的前缀。在模板文件中,我们可以方便的引用静态文件。1
<link rel="stylesheet" type="text/css" href="{{ static_url('css/base.css') }}">
使用
static_url
函数将相对于我们指定的static_path
文件位置作为参数。这个类似比下
Flask
中的url_for
:1
<script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
在模板中使用后台传过来的数据,这个和
jinja2
基本一致我们实现这样一个页面渲染
渲染循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{% for order in orders %}
<dd class="item clearfix">
<div class="item-row">
<div class="col col-1">
<div class="g-pic">
<img src="{{ order['image'] }}" srcset="{{ order['image'] }} 2x" width="40" height="40">
</div>
<div class="g-info">{{ order['name'] }}</div>
</div>
<div class="col col-2">{{ order['price'] }}元</div>
<div class="col col-2">{{ order['nums'] }}</div>
<div class="col col-2">{{ order['price']*order['nums'] }}元</div>
<div class="col col-2">{% raw order['detail'] %} </div>#}
</div>
</dd>
{% end %}这个和
jinja2
类似,直接计算两个变量乘法1
2
3{{ order['price']*order['nums'] }}
引用原生的`html`元素`{% raw order['detail'] %}`(其中`detail`为:`"detail": "<a href='http://www.baidu.com'>查看详情</a>"`)进行字符转义。
上面的乘法可以由后台传入一个计算方法。
1
2
def cal_total(price, nums):
return price*nums
将方法的引用传入到模板中可以直接使用方法。
1 | {% from chapter02.utils import cal_total %} |
设置变量
1 | {% set total = 0 %} |
template的页面继承和重载
tornado
的模板继承和重载机制和jinja2
基本一致,暂时不详细记录笔记。
1 | {% extends 'base.html' %} |
tornado模板中UIModule
tornado
的模板文件可以像vue
等前端框架一样进行组件化开发。
首先我们创建一个Module
复用类:
1 | class OrderModule(tornado.web.UIModule): |
其中order-list.html
为:
1 | <dd class="item clearfix"> |
在settings
中设置ui_modules
,值为键值对。
1 | settings = { |
在模板中引用我们抒写的模块
1 | {% module OrderModule(order) %} |
除了可以复用html
外还可以复用css
,js
文件。
tornado的settings
这个小节我们看下settings
有哪些值是可以配置的。
我们看下官方文档:tornado的settings有哪些