模板:html
在tornado中,模板就是一个html文件,可是模板经过模板语法,由tornado服务渲染以后,能够动态的往页面中填入数据 。tornado自带模板语法,不须要再用其余的模板插件python
模板初识:web
以前咱们经过render能够返回一个html页面,不过那都是固定的页面,固定的数据,可是若是数据是不肯定的,是会不断改变的,该怎么作呢?express
是否能够先把页面写好,而后预留出固定的位置,在须要的时候再填入数据便可?浏览器
04-templates.py文件:app
import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options from tornado.web import RequestHandler from tornado.options import define,options define('port',default=8080,help='run server',type=int) class MainHandler(RequestHandler): def get(self): self.render('in_out.html') def post(self): name = self.get_argument('name','') self.write(name) class TemHandler(RequestHandler): def get(self): self.write('hello world') def post(self): name = self.get_argument('name','') self.render('02-templates.html',username= name) application = tornado.web.Application( handlers=[ (r'/',MainHandler), (r'/tem',TemHandler), ], debug=True, template_path = 'templates', static_path='static' ) if __name__ == '__main__': tornado.options.parse_command_line() http_server = tornado.httpserver.HTTPServer(application) http_server.listen(options.port) tornado.ioloop.IOLoop.current().start()
请求的html表单,in_out.html:tornado
<body> <form method="post" action="/tem"> <p>用户名<input type="text" name="name"></p> <p>密码<input type="password" name="password"></p> <input type="submit"> </form> </body>
返回的html模板,02-templates.htmloop
<body> 欢迎 {{ username }} 登录 </body>
模板语法,模板符号:post
{{ expression }}google
用 {{ expression }} 中间是任何 python 表达式,或者是一个变量
{% directives %}
其余的模板指令
{# … #}
在模板中要注释python表达式的运行,须要使用这个模板语法
{{! {%! {#!
若是不想执行内容,须要在页面上打印出模板符号,只须要加上感叹号( ! )便可。输出源代码
控制语句:if判断
在模板中可使用 if 判断 注意:最后须要以 {% end %} 结尾
实例以下:
<body> 欢迎 {{ username }} 登录 <br> {{ 1+1 }} <br> {{ time.ctime() }} <!--两个大括号能够运行python的表达式--> <br> <br> <!--控制流程--> {#% %#} {% if username !='' %} 欢迎 {{ username }} 登录 {% else %} 请登陆 {% end %} <br> <br> <!--{{ time.ctime() }} 这种方式会在后台仍然执行 下面使用{# #}注释语法--> {# time.ctime() #} <br> <!--不进行运算,将表达式显示在页面--> {{! 1+1 }} </body>
循环语句:
for 循环:
在 tornado 模板中可使用 for 循环 注意:最后须要以 {% end %} 结尾
while 循环:
在 tornado 模板中可使用 while 循环 注意:最后须要以 {% end %} 结尾
python文件中传入变量:
class TemHandler(RequestHandler): def get(self): self.write('hello world') def post(self): urllist=[ ('http://www.baidu.com','百度一下'), ('http://www.zhihu.com','知乎'), ('http://www.google.com','谷歌'), ] name = self.get_argument('name','') self.render('02-templates.html', username= name, time = time, urllist = urllist, )
模板文件展现:
<body> {% for i in urllist %} <a href="{{ i[0] }}" target="_blank">{{ i[1] }}</a> <br> {% end %} <br> <!--须要提早设置--> {% set a =0 %} {% while a < 8 %} {{ a }} <br> {% set a+=1 %} {% end %} </body>
选择模板类型:File--->Setting--->Python Template Languages (jinja2)
模板转义
转义:
页面并无解析,只是看成一个字符串,直接在页面上打印出来 tornado默认是自动的转义,传入的数据都会看成字符串,不会被浏览器解析
class TemHandler(RequestHandler): def get(self): pass def post(self): atga =''' <a href="http://www.baidu.com" target="_blank">百度一下,你就知道</a> ''' self.render('02-templates.html', atga = atga ) application = tornado.web.Application( handlers=[ (r'/',MainHandler), (r'/tem',TemHandler), ], debug=True, template_path = 'templates', static_path='static', autoescape = None, #全局取消转义 )
模板.html
<!DOCTYPE html> {#取消整个页面的转义#} {#{% autoescape None %}#} <html lang="en"> <head> <meta charset="UTF-8"> <title>Templates</title> </head> <body> {# raw 局部取消转义#} {# {% raw atga %}#} <br> {# 批量取消转义两种方法,1。取消整个页面的转义。2.取消整个项目的转义#} {{ atga }} {{ atga }} {{ atga }} {{ atga }} {{ atga }} {{ atga }} {# 局部开启转义#} {{ escape(atga) }} </body> </html>
静态文件引入
设置静态资源目录
application = tornado.web.Application( handlers=[ (r'/',MainHandler), (r'/tem',TemHandler), ], debug=True, template_path = 'templates', static_path='static', #设置静态资源文件位置 autoescape = None, #全局取消转义 )
模板中引入静态资源:static_url为内置方法
两种引入方式
<body> {% if username !='' %} 欢迎 {{ username }} 登陆 <img src="static/images/01.jpg" width="200px" alt=""> <img src="{{ static_url('images/02.webp') }}" width="200px" alt=""> {% else %} 亲,请登陆 {% end %} </body>
两种静态资源引入的不一样: