Tornado框架06-模板
01-静态文件
static_path引用文件
配置静态文件的路径,告诉tornado从文件系统中的一个特定的位置提取静态文件
使用:
"static_path": os.path.join(BASE_DIRS, "static")
作用:
引入其他文件
<!--<link rel="stylesheet" href="/static/css/home.css" />-->
<link rel="stylesheet" href="{{static_url('css/home.css')}}" />
请求:
http://127.0.0.1:9808/static/html/index.html
StaticFileHandler
使用原因
http://127.0.0.1:9808/static/html/index.html这种请求方式不友好
本质
tornado预置的用来提供静态资源文件的handler
作用:自由映射静态文件
使用
(r'/(.*)$', tornado.web.StaticFileHandler,{"path":os.path.join(config.BASE_DIRS, "static/html")})
(r'/(.*)$', tornado.web.StaticFileHandler, {"path": os.path.join(config.BASE_DIRS, "static/html"),"default_filename":"index.html"})
注意:最好在所有的路由下面使用,否则可能导致其他路由不可用
1.http://127.0.0.1/static/html/index.html
2.http://127.0.0.1/
3.http://127.0.0.1/view/index.html
02-模板
路径与渲染
使用模板,需要仿照静态文件路径设置一样,向web.Application类的构造函数传递一个名为template_path的参数来告诉Tornado从文件系统的一个特定位置提供模板文件,如:
app = tornado.web.Application([(r'/', IndexHandler)],static_path=os.path.join(os.path.dirname(__file__), "statics"),template_path=os.path.join(os.path.dirname(__file__), "templates"),
)
在这里,我们设置了一个当前应用目录下名为templates的子目录作为template_path的参数。在handler中使用的模板将在此目录中寻找。
现在我们将静态文件目录statics/html中的index.html复制一份到templates目录中,此时文件目录结构为:
├── statics
│ ├── css
│ │ ├── index.css
│ │ ├── main.css
│ │ └── reset.css
│ ├── html
│ │ └── index.html
│ ├── images
│ │ ├── home01.jpg
│ │ ├── home02.jpg
│ │ ├── home03.jpg
│ │ └── landlord01.jpg
│ ├── js
│ │ ├── index.js
│ │ └── jquery.min.js
│ └── plugins
│ ├── bootstrap
│ │ └─...
│ └── font-awesome
│ └─...
├── templates
│ └── index.html
└── test.py
在handler中使用render()方法来渲染模板并返回给客户端。
class IndexHandler(RequestHandler):def get(self):self.render("index.html") # 渲染主页模板,并返回给客户端。
模板语法
变量与表达式
在tornado的模板中使用{{}}作为变量或表达式的占位符,使用render渲染后占位符{{}}会被替换为相应的结果值。
我们将index.html中的一条房源信息记录
class HomeHandler(RequestHandler):def get(self, *args, **kwargs):temp = 18self.render('home.html', age=temp)class HomeHandler(RequestHandler):def get(self, *args, **kwargs):temp = 18per = {"name":"sun","height":175}stu = {"id":123456,"weight":50}self.render('home.html', age=temp, per=per, **stu)
改为模板:
<h1>年龄:{{age}}</h1>
<h1>年龄:{{age + 10}}</h1><h1>{{per["name"]}}</h1>
<h1>{{per["height"]}}</h1><h1>{{id}}</h1>
<h1>{{weight}}</h1>
{{}}不仅可以包含变量,还可以是表达式,如:
控制语句
可以在Tornado模板中使用Python条件和循环语句。控制语句以{\%和\%}包围,并以类似下面的形式被使用:
{% if page is None %}
或
{% if len(entries) == 3 %}
控制语句的大部分就像对应的Python语句一样工作,支持if、for、while,注意end:
{% if ... %} ... {% elif ... %} ... {% else ... %} ... {% end %}
{% for ... in ... %} ... {% end %}
{% while ... %} ... {% end %}
函数
static_url()
Tornado模板模块提供了一个叫作static_url的函数来生成静态文件目录下文件的URL。读取配置中的static_path值,并将参数拼接到该路径下返回一个新路径如下面的示例代码:
<link rel="stylesheet" href="{{ static_url("style.css") }}">
这个对static_url的调用生成了URL的值,并渲染输出类似下面的代码:
<link rel="stylesheet" href="/static/style.css?v=ab12">
优点:
- static_url函数创建了一个基于文件内容的hash值,并将其添加到URL末尾(查询字符串的参数v)。这个hash值确保浏览器总是加载一个文件的最新版而不是之前的缓存版本。无论是在你应用的开发阶段,还是在部署到生产环境使用时,都非常有用,因为你的用户不必再为了看到你的静态内容而清除浏览器缓存了。
- 另一个好处是你可以改变你应用URL的结构,而不需要改变模板中的代码。例如,可以通过设置static_url_prefix来更改Tornado的默认静态路径前缀/static。如果使用static_url而不是硬编码的话,代码不需要改变。
转义
写入的js程序并没有运行,而是显示出来了:
我们查看页面源代码,发现<、>、”等被转换为对应的html字符
这是因为tornado中默认开启了模板自动转义功能,防止网站受到恶意攻击。
class Transferred(RequestHandler):def get(self, *args, **kwargs):str = "<h1>sun is a good man</h1>"# str = "<script>alert('sunck good')</script>"self.render('transferred.html', str=str)
模板:将str当成一个普通字符串来显现
<body>{{str}}
</body>
我们可以通过raw语句来输出不被转义的原始格式,如:
关闭当前标签中的自动转义
{% raw text %}
注意:在Firefox浏览器中会直接弹出alert窗口,而在Chrome浏览器中,需要set_header(“X-XSS-Protection”, 0)
若要关闭自动转义,一种方法是在Application构造函数中传递
autoescape=None,
另一种方法是在每页模板中修改自动转义行为,添加如下语句:
关闭当前页面的自动转义
{% autoescape None %}
escape()
已经关闭了自动转义,但是在某个位置需要开启自动转义,如:
{{ escape(text) }}
自定义函数
在模板中还可以使用一个自己编写的函数,只需要将函数名作为模板的参数传递即可,就像其他变量一样。
我们修改后端如下:
index.py
def mySum(a, b):return a + b
self.render('home.html', age=temp, per=per, flag=False, stus=stus, mySum=mySum, **stu)
模板
<h1>使用自定义函数:{{mySum(5,8)}}</h1>
块
我们可以使用块来复用模板,块语法如下:
父模板
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{title}}</title>
</head>
<body>{% block main %}{% end %}
</body>
</html>
而子模板index.html使用extends来使用父模板base.html,如下:
{% extends "base.html" %}{% block main %}
<h1>sunck is a handsome man</h1>
{% end %}
Tornado框架06-模板相关推荐
- 第二百六十六节,Tornado框架-XSS处理,页码计算,页码显示
Tornado框架-XSS处理,页码计算,页码显示 Tornado框架-XSS攻击过滤 注意:Tornado框架的模板语言,读取数据已经自动处理了XSS攻击,过滤转换了危险字符 如果要使危险字符可以远 ...
- 第二百五十八节,Tornado框架-逻辑处理get()方法和post()方法,初识模板语言
Tornado框架-逻辑处理get()方法和post()方法,初识模板语言 Tornado框架,逻辑处理里的get()方法,和post()方法 get()方法,处理get方式的请求 post()方法, ...
- Tornado框架中视图模板Template的使用
上文的程序中有这样一段: class MessageHandler(tornado.web.RequestHandler):def get(self):self.write(''' <html& ...
- 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算
Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...
- 自学Python第二十六天- Tornado 框架
自学Python第二十六天- Tornado 框架 安装及基础引用 创建.配置.初始化应用及简单运行服务 创建应用 对 app 进行设置 另一种设置方法 一些其他的配置 关于调试模式 设置路由处理器 ...
- Python WEB开发:1024程序员节用Tornado框架制作简易【表白墙】网站
嗨害大家好鸭! 我是小熊猫❤ 眼瞅着1024程序员节就快到了 不知道会不会有人被表白- 我先来自己做一个表白墙 给我的好兄弟提供一个表白的平台哈哈哈哈 有什么python相关报错解答自己不会的.或者源 ...
- Python Tornado框架
本文参考 https://blog.csdn.net/weixin_42225318/article/details/81384000https://blog.csdn.net/Bryce_Liu/a ...
- python excel处理框架_django框架基于模板 生成 excel(xls) 文件操作示例
本文实例讲述了django框架基于模板 生成 excel(xls) 文件操作.分享给大家供大家参考,具体如下: 生成Excel 文件,很多人会采用一些开源的库来实现,比如python 自带 csv 库 ...
- 第三百一十节,Django框架,模板语言
第三百一十节,Django框架,模板语言 模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到h ...
- php框架中什么是渲染,thinkPHP5框架渲染模板的3种方式简述
本文实例讲述了thinkPHP5框架渲染模板的3种方式.分享给大家供大家参考,具体如下: 默认情况下,控制器的输出全部采用return的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出. 在 ...
最新文章
- java cmd copy_将CMD输出复制到剪贴板
- Flask-Email的相关知识点实现(发送电子邮件)
- 理解java中的两种接口
- 汪星人出门也靠脸?狗脸识别技术可识别化妆后的汪星人,准确率99%
- 搜索4--noi6264:走出迷宫
- Javascript是否通过引用传递?
- Project FreeEIM 2.0:重现失落的飞鸽传书
- STM32“隐藏的定时器”-DWT
- Microsoft Project学习系列(一)
- SQL Server获取月度列表
- TOONTRACK Electronic Edge EZX(Toontrack打击乐扩展包)
- 贵安新区生物医学大数据中心揭牌成立
- 2021-08-08三大范式与JDBC
- Mac系统如何显示隐藏文件
- [初级理论]给老婆做测试培训-02
- Java开发编码规范
- Matlab R2019b[破]安装教程
- 互联网协议学习笔记-----IP协议与传输协议
- 美公共警报系统曝漏洞 专家:警惕预警系统上演狼来了
- c语言remove和rename不起作用,C语言探索之旅 | 第二部分第七课:文件读写
热门文章
- 既然MAC地址是唯一的,为什么还需要IP地址?
- python画热力分布图 pil_Python画attention map与原图叠加的热力图
- Appium的入门使用
- 面试官:这么简单的正则表达式都不会?
- [springboot一本通]-1.6.开发过程中常用IDEA插件
- Springboot 整合Retry 实现重试机制
- 解析几何----拉格朗日乘数法在解析几何中的应用
- 求csdn积分啊呜呜呜
- 密码打码就安全了吗?这款星标 20K 的去 『马赛克』 开源神器,用 AI 一秒还原高清原图!...
- 一位大学生的自我救赎之路