当我们有多个模板的时候,很多模板之间其实相似度很高。我们期望可以重用部分网页代码。这在tornado中可以通过extends语句来实现。为了扩展一个已经存在的模板,你只需要在新的模板文件的顶部放上一句{% extends "filename.html" %}。比如,为了在新模板中扩展一个父模板(在这里假设为之前我们使用过的index.html),你可以这样使用:{% extends "index.html" %}

这就使得新文件继承index.html的所有标签,并且覆写为期望的内容。

新添加一个indexHandler_temp类来返回index1.html

class indexHandler_temp(tornado.web.RequestHandler):

def get(self, *args, **kwargs):

return self.render('index1.html')

index1.html中的代码如下

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>index1</title>

</head>

<body>

{% extends "index.html" %}

</body>

</html>

当我们访问http://127.0.0.1/index1的时候得到的页面会和index中的页面是一模一样的。

在这里通过extends完全继承了父页面,但是实际子页面和父页面还是有很多差别的。我们需要在子页面上定义很多自己的东西,这里就需要用到block语句,在index页面中添加如下的描述:

{% block info %}<p>父页面</p>{% end %}

然后在index1页面中添加,这里重写了block info的信息。

{% block info %}

<p>index1重写block info</p>

{% end %}

得到的页面显示如下,可以看到block info中的信息为“index1重写block info”, 覆盖了父页面的描述。

当然还可以在block中引用变量

{% block info %}

<p>{{ info }}</p>

{% end %}

在对应的代码中传递该变量的值就可以了

class indexHandler_temp(tornado.web.RequestHandler):

def get(self, *args, **kwargs):

return self.render('index1.html',info="information of index1

UI模板:

UI模块是封装模板中包含的标记、样式以及行为的可复用组件。它所定义的元素通常用于多个模板交叉复用或在同一个模板中重复使用。模块本身是一个继承自Tornado的UIModule类的简单Python类,并定义了一个render方法。当一个模板使用{% module Foo(...) %}标签引用一个模块时,Tornado的模板引擎调用模块的render方法,然后返回一个字符串来替换模板中的模块标签。UI模块也可以在渲染后的页面中嵌入自己的JavaScript和CSS文件,或指定额外包含的JavaScript或CSS文件。你可以定义可选的embedded_javascript、embedded_css、javascript_files和css_files方法来实现这一方法。

来看下如何使用,首先定义一个HelloModule继承自tornado.web.UIModule

class HelloModule(tornado.web.UIModule):

def render(self, *args, **kwargs):

return '<h1>hello world</h1>'

在Application中添加ui_module的赋值:ui_modules={'hello':HelloModule}

在index1中使用{% module hello() %}。此时运行,index1会显示hello world

在来看下更高级的应用,在ui module中传递参数。

第一步:首先在indexHandler_temp中添加books的定义,在一个列表中包含一个字典。

class indexHandler_temp(tornado.web.RequestHandler):

def get(self, *args, **kwargs):

return self.render('index1.html',books=[

{

"title":"Programming Collective Intelligence",

"subtitle": "Building Smart Web 2.0 Applications",

"image":"/static/images/collective_intelligence.gif",

"author": "Toby Segaran",

"date_added":1310248056,

"date_released": "August 2007",

"isbn":"978-0-596-52932-1",

"description":"<p>This fascinating book demonstrates how you "

"can build web applications to mine the enormous amount of data created by people "

"on the Internet. With the sophisticated algorithms in this book, you can write "

"smart programs to access interesting datasets from other web sites, collect data "

"from users of your own applications, and analyze and understand the data once "

"you've found it.</p>"

},])

然后修改HelloModule的定义,在这里返回采用self.render_string的函数。并且返回temp.html页面,并传递参数book

class HelloModule(tornado.web.UIModule):

def render(self, book):

return self.render_string('temp.html',book=book)

下面来看下index1.html页面的代码:

{% for book in books %}

{% module Book(book) %}

{% end %}

temp.html页面的代码:

<div class="book">

<h3 class="book_title">{{ book["title"] }}</h3>

{% if book["subtitle"] != "" %}

<h4 class="book_subtitle">{{ book["subtitle"] }}</h4>

{% end %}

<div class="book_details">

<div class="book_date_released">Released: {{ book["date_released"]}}</div>

<div class="book_date_added">

Added: {{ locale.format_date(book["date_added"], relative=False) }}

</div>

<h5>Description:</h5>

<div class="book_body">{% raw book["description"] %}</div>

</div>

</div>

当访问index1页面的时候,结果如下:

下面来介绍下运行机制:

1 在index1中遍历books并对每个遍历到的字典调用Book(book)

2 此时调用HelloModule,传入字典book。并通过在temp.html中实现呈现代码

3 在temp.html中写HTML代码,呈现字典中的信息。

通过这种方法,可以将books的呈现方式抽象出来,只要其他页面想调用的时候,只需要调用Book这个模块就可以了。不用每个页面都去实现遍历实现。

tornado之模板扩展的更多相关文章

  1. tornado下模板引擎的使用

    模板引擎 Tornado中的模板语言和django中类似,模板引擎将模板文件载入内存,然后将数据嵌入其中,最终获取到一个完整的字符串,再将字符串返回给请求者. Tornado =的模板支持“控制语句” ...

  2. VS自定义项目模板:[2]创建VSIX项目模板扩展

    VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...

  3. 学习tornado:模板

    第一次接触tornado的template,是在做oastub的时候,因为一位同学在handler里面硬编码了html代码,我决定引入template机制来降低逻辑与页面的耦合. 简介 tornado ...

  4. Tornado之模板

    知识点 静态文件配置 static_path StaticFileHandler 模板使用 变量与表达式 控制语句 函数 块 4.1 静态文件 现在有一个预先写好的静态页面文件 (下载静态文件资源), ...

  5. 第二百六十一节,Tornado框架模板引擎本质

    Tornado框架模板引擎本质 只需要了解一下即可 本篇就来详细的剖析模板处理的整个过程. 上图是返回给用户一个html文件的整个流程,较之前的Demo多了绿色流线的步骤,其实就是把[self.wri ...

  6. 第二百五十九节,Tornado框架-模板语言的三种方式

    Tornado框架-模板语言的三种方式 模板语言就是可以在html页面,接收逻辑处理的self.render()方法传输的变量,将数据渲染到对应的地方 一.接收值渲染 {{...}}接收self.re ...

  7. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...

  8. luogu P5410 模板 扩展 KMP Z函数 模板

    LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...

  9. web框架详解之tornado 一 模板语言以及框架本质

    一.概要 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

随机推荐

  1. Android 中图可以用到的图片处理类 BitmapUtils

    Android在实际开发中很多时候都要对图片进行一定的处理,这里总结的BitmapUtils 类包括一下几个功能: 1.Android图片倒影, 2.Android图片模糊处理, 3.Android图 ...

  2. 关于vsftp所遇问题

    问题:使用ftp工具上传文件时提示 553 Could not create file.错误: 严重文件传输错误解决方法:除了检查ftp服务外,需要使用 getsebool -a|grep ftp, ...

  3. 数据结构自己实现——queue

    SeqQueue.h #define QueueSize 100 typedef char DataType; class SeqQueue { public: DataType data[Queue ...

  4. 本地hosts文件

    (1)什么是Hosts文件? Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网 ...

  5. osstatus -9801 workerman websocket 小程序不带端口

    帮事业部的同事,解决问题,坑总结 小程序出现,osstatus -9801 情况好多,说一下配置环境可解决的方法和问题 tls 1.2, php 5.6+, nginx, workerman 做的 w ...

  6. 洛谷——P1331 海战

    P1331 海战 题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防 ...

  7. spring mvc构建WEB应用程序入门例子

    在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请 ...

  8. BT服务器的搭建(tracker-P2P服务器架设)(转)

    文章虽然有点老,但原理差不多. 继上一篇文章(http://www.cnblogs.com/EasonJim/p/6601146.html)介绍了BT的原理,现在来看下BT服务端搭建的原理. 一.BT ...

  9. java计算年龄

    精确到天计算年龄 public static int getAgeByCardId(String card) throws Exception { Integer len = card.length( ...

  10. 细说Redis持久化机制

    概述 Redis不仅能够作为缓存来使用,也能够作为内存数据库. Redis作为内存数据库使用时.必需要解决一个问题:数据的持久性.有些将Redis作为缓存使用的场景也需要将缓存的数据持久化到存储介质上 ...