一、模板的继承
1、extends
{% extends filename %}继承模板,在子模板中会把父模板的所有内容都继承到子模板中,减少大量重复代码。
2、block
{% block name %}...{% end %}
在父模板中被词语句包裹的代码块在子模板中可以被重写,覆盖父模板中的语句。
3、示例
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}Torando{% end %}</title>
<link rel="shortcut icon" href="{{ static_url('images/hu.ico')}}"/>
</head>
<body>
{% block body %}
<br>
{% if username != 'no' %}
欢迎{{username}}!!!</br>
{% else %}
请登录
{% end %}
是第{{num}}号
{% end %}
</body>
</html>
3extends.html
{% extends base.html %}
{% block title %}
Extend the father band
{% end %}
{% block body %}
<h1>继承父模板的子模板</h1>
{% if username != 'no' %}<br>
欢迎<b>{{username}}</b>!!!</br>
{% else %}
请登录
{% end %}
<img src="{{ static_url('images/1.jpg') }}" width="250" height="250"/>
<br>
{% include 4static_modle.html %}
{% end %}
二、模板文件的导入
1、include标签可以导入模板文件,但是导入的模板中不要再出现 extends 和 block两个标签。
2、include
{% include filename%}(注意:在django中filename加单引号
)
include 可以导入一些其他的模板文件,一般使用 include 的时候,模板文件中不使用 block 块 。
3、静态文件的示例
导入用法在3extends.html中
4static_modle.html
<font style="color:yellow">我是静态文件哈!!!!</font>
三、函数和类的导入(导入到相应的模板中)
1、渲染html文件时导入(在 Handler 中渲染模板时传入)
class Calculation():
def sum(self, a, b):
return a+b
class ExtendsHandler(tornado.web.RequestHandler):
def get(self):
username ='小明'
self.render('3extends.html', username=username, hu=self.hu, Calculation=Calculation)#导入的类和方法为Calculation和hu方法
def hu(self):
return 'this is class and way be transfered by the modle'
{% extends base.html %}
{% block title %}
Extend the father band
{% end %}
{% block body %}
<h1>继承父模板的子模板</h1>
{% if username != 'no' %}<br>
欢迎<b>{{username}}</b>!!!</br>
{% else %}
请登录
{% end %}
<img src="{{ static_url('images/1.jpg') }}" width="250" height="250"/>
<br>
{% include 4static_modle.html %}
<br>
{{ hu() }}
<br>
{% set c=Calculation() %}
数字的和为<b>{{ c.sum(5 ,8) }}。</b>
{% end %}
2、模板中直接导入
- 导入内置模块(直接在子模块中进行)
{% import time %}
{{ time.time() }}
- 导入自定义模块
自定义模块的文件内容:mod_file.py
class Calculation1:
def sum(self, a, b):
return a+b
def add(a, b):
return a+b
def upper(s):
return s.upper()
导入自定义模块(在子模块中进行渲染)
{% from mod_file import Calculation1,upper,add %}
{% set s=Calculation1() %}
导入自定义模块的和为{{ s.sum(5,6) }}<br>
{{ upper('this a bird') }}<br>
导入自定义模块方法的和{{ add(4,7) }}
注意:python解释器查找 mod_file 时是根据 py 文件的路径来查找的,不是根据模板的路径来查找
- 应用自定义模块中的方法
以上面的自定义mod_file.py模块为基准
{% apply upper %}
{% include 4static_modle.html %} #小写变为大写
{% end %}
用apply语句,使用函数的作用范围到最近的{%end%}为止。
四、ui_methods和ui_modules的应用(进行复用效果)
参考文档:https://tornado-zh.readthedocs.io/zh/latest/guide/templates.html
1、第一步
- 新建文件ui_methods.py
新建文件ui_methods.py ,这里的文件名是随意的只要在import时合法即可,这里可以新建一个文件夹,如utils,来放置 ui_methods.py 和 ui_modules.py
def methods1(self): #注意这里要加上self
return 'ui_methods 1'
def methods2(self):
return 'ui_methods 2'
- 新建文件ui_modules.py
新建文件ui_modules.py,使用ui_modules需要继承UIModule类
from tornado.web import UIModule
class UiModule(UIModule):
def render(self, *args, **kwargs):
return '我是 ui_module'
2、第二步
在项目中导入import utils.ui_modules和import utils.ui_methods
,是在app_demo.py(启动tornado项目的文件夹下)
3、第三步
配置 Application 参数
可以写成
ui_methods=utils.ui_methods,
ui_modules=utils.ui_modules,
也可以写成字典形式:
ui_modules={
'UiModule':utils.ui_modules.UiModule,
}
import random
import time
import datetime
import tornado.web
import tornado.ioloop
from tornado.options import options, define, parse_command_line
import utils.ui_methods
import utils.ui_modules
define('port', default=8080,help="运行端口")
class FirstHandler(tornado.web.RequestHandler):
def get(self):
self.write("<h1><span style='color:red'>这是首页面</span></h1>")
class PictureHandler(tornado.web.RequestHandler):
def get(self):
self.write("<html><body><img src='/static/images/1.jpg'></body></html>")
#这里satic前面加上/(正斜杆)是代表绝对路径,如果不加,则代表相对路径,但是在多个路由的时候就会报错。
def initialize(self):
print('对象{}被创建了'.format(self))
class TemplateHandler(tornado.web.RequestHandler):
def get(self):
username = '小龙'
items = ["Item 1", "Item 2", "Item 3"]
line = "====="*6
time_now = time.time()
atga = "<a href='http://www.baidu.com' target='_blank'>_百度_</a><br>"
student_list = [
{'name': '小红', 'age': 18, 'hobby': '打篮球', 'web': 'http://www.baidu.com'},
{'name': '小明', 'age': 16, 'hobby': '打篮球', 'web': 'http://www.jianshu.com'},
{'name': '小浩', 'age': 20, 'hobby': '打羽毛球', 'web': 'http://www.baidu.com'},
]
self.render('1demo.html', username=username, title="基础模板", items=items, students=student_list, line=line, time=time_now, atga=atga)
def post(self):
username = self.get_argument('name', 'no')
number = int(random.random()*100 + 1)
self.render('2demo.html', username=username, num=number)
class Calculation():
def sum(self, a, b):
return a+b
class ExtendsHandler(tornado.web.RequestHandler):
def get(self):
username ='小明'
self.render('3extends.html', username=username, hu=self.hu, Calculation=Calculation)
def hu(self):
return 'this is class and way be transfered by the modle'
def make_app():
handlers = [
(r'/', FirstHandler),
(r'/picture', PictureHandler),
(r'/template', TemplateHandler),
(r'/extends', ExtendsHandler)
]
settings = \
{'debug': True,
'static_path': 'static',
'template_path': 'templates',
'ui_methods': utils.ui_methods,
'ui_modules': utils.ui_modules
}#直接写staic这里是相对路径,这是相对与这个脚本的路径而言的
app = tornado.web.Application(handlers=handlers, **settings)
return app
if __name__ == '__main__':
app = make_app()
# app.listen(8000)
parse_command_line()
port_new = options.port
app.listen(port_new)
print(type(port_new))
print("Tornado server running at %s port" % port_new)
tornado.ioloop.IOLoop.current().start()
4、第四步
在所有相应模板中调用
<br>{% module UiModule() %}
<br>{{ methods1() }}<br>
5、其他方法
linkify
<br>{%raw linkify('百度: http://www.baidu.com') %}<br>
linkify生成一个链接,但是要注意模板转义
网友评论