tornado之模板扩展

当我们有多个模板的时候,很多模板之间其实相似度很高。我们期望可以重用部分网页代码。这在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这个模块就可以了。不用每个页面都去实现遍历实现。

时间: 2024-08-29 17:16:01

tornado之模板扩展的相关文章

第三章:模板扩展

在第二章中,我们看到了Tornado模板系统如何简单地传递信息给网页,使你在插入动态数据时保持网页标记的整洁.然而,大多数站点希望复用像header.footer和布局网格这样的内容.在这一章中,我们将看到如何使用扩展Tornado模板或UI模块完成这一工作. 3.1 块和替换 当你花时间为你的Web应用建立和制定模板时,希望像你的后端Python代码一样重用你的前端代码似乎只是合逻辑的,不是吗?幸运的是,Tornado可以让你做到这一点.Tornado通过extends和block语句支持模板

Tornado之模板

知识点 静态文件配置 static_path StaticFileHandler 模板使用 变量与表达式 控制语句 函数 块 4.1 静态文件 现在有一个预先写好的静态页面文件 (下载静态文件资源), 我们来看下如何用tornado提供静态文件. static_path 我们可以通过向web.Application类的构造函数传递一个名为static_path的参数来告诉Tornado从文件系统的一个特定位置提供静态文件,如: app = tornado.web.Application( [(r

tornado的学习——第三章(模板扩展)

链接:http://demo.pythoner.com/itt2zh/ch3.html (1)块和替换: {% extends %} (2)块基础: {% block %} (3)自动转义:使用自动转义不会(类似Django的过滤器safe) 在输入评论的时候,看看有没有xss漏洞 Totally hacked your site lulz <script>alert('RUNNING EVIL H4CKS AND SPL01TS NOW...')</script>tornado的

python SSTI tornado render模板注入

原理tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式.简单的理解例子如下:------------------------------------------------------------------------------------import tornado.ioloopimport tornado.web cla

2018护网杯easy_tornado(SSTI tornado render模板注入)

考点:SSTI注入 原理: tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式. 网上看到的例子: #!/usr/bin/env python # -*- coding:utf-8 -*- from tornado.web import UIModule from tornado import escape class cust

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

VS2013(VS2010等版本也适用,均需安装Visual Studio SDK) 如何创建VSIX扩展项目? 1 新建项目-->选择扩展性中的VSIX Project项目. 2 双击打开source.extension.vsixmanifest文件,设置VSIX扩展项目的一些基础信息. 3 为VSIX扩展项目添加上篇经验导出的模板. 在Assets(资产)标签中新建,选择Type为Microsoft.VisualStudio.ProjectTemplate(项目模板),Source选择Fil

Tornado小记 -- 模板中的Handler

在Tornado的前端页面模板中,Tornado提供了一些对象别名来快速访问对象,具体定义可以参考Tornado官方文档! 这里我想将的是Handler这个对象,Handler指向的处理当前这个页面的RequestHandler对象!但我在Tornado的Blog Demo中,发现了这样的语句: 1 <title> 2 {{ escape(handler.settings["blog_title"]) }} 3 </title> 但是奇怪的是RequestHan

underscore.js 模板扩展

underscore模板插件定制 加入特性: 1.嵌套模板 2.支持渲染过滤器模式{{A | filterA:arg1..}} 3.缓存(考虑加入localstorage?) 4.调试 todo 性能优化 异步渲染 代码如下 <!-- lang: js --> (function (_) { _.templateSettings = { evaluate : /{%([\s\S]+?)%}/g, interpolate: /{{([\s\S]+?)}}/g, escape : /{%-([\s

模板——扩展欧几里得算法

//gcd LL gcd(LL a, LL b) { return b == 0 ? a : gcd(b, a%b); } //exgcd LL exgcd(LL a, LL b, LL &d, LL &x, LL &y) { if(!b) {d = a; x = 1; y = 0;} else {gcd(b, a%b, d, y, x); y -= x*(a/b);} }