一、模板
#模板就是一个HTML文件,只是其中添加了模板语法,需要服务器的渲染才能正常显示数据
#通过render可以返回一个html网页,不过那都是固定的页面,固定的数据,如果数据是不确定的,是会不断改变的,该如何做? #先把页面写好,然后预留出固定的位置,在需要的时候再填入数据即可
class MainHandler(tornado.web.RequestHandler): def get(self): self.write('template') self.render('lesson2.html') def post(self, *args, **kwargs): #在页面内动态地传入参数 name = self.get_body_argument('name','no') # self.write(name) self.render('lesson04_templates.html', #提交以后的页面应该跳转为这个页面,而不是仅仅输出一个name username = name #提取body属性,将name赋值给username )
#模板 #在tornado中,模板就是一个html文件,但是模板通过模板语法,由tornado服务渲染之后,可以动态地往页面填入数据 #tornado自带模板语法,不需要再用其他的模板插件
二、模板符号
class MainHandler(tornado.web.RequestHandler): def get(self): self.write('template') self.render('lesson2.html') def post(self, *args, **kwargs): #在页面内动态地传入参数 name = self.get_body_argument('name','no') urllist = [ ('http://www.baidu.com','去百度'), ('http://www.shiguangkey.com','去时光'), ('http://www.zhihu.com','去知乎') ] # self.write(name) self.render('lesson04_templates.html', #提交以后的页面应该跳转为这个页面,而不是仅仅输出一个name username = name ,#提取body属性,将name赋值给username time = time, urllist = urllist )
<body> #代表一个python表达式 hello {{ username }} #大括号可出输出变量的值 <br> {{ 1+1 }} # 输出计算结果 <br> {{ a = time.time() }} #输出执行方法(当前的时间戳),必须加括号,不然就是一个函数对象 <br> #代表一个指令 {% if username != 'xuwei' %} 欢迎{{ username}} 登录 {% else %}} 请登录 {% end %} #使用if必须要用end结束,因为模板跟python一样不是以缩进来约束代码块 <br> #代表一个注释 <!--{{ a = time.time() }}--> #在这里虽然被注释掉了,但是在页面运行的时候,页面不会显示,但是这个表达式还是运行了,只不过是在源代码会显示时间戳 <!--{#a = time.time() #}--> #这样才是注释,页面不会显示,源代码也不会 <br> #代表输出源码。不执行,加个!即可 {{! 1+1 }} #这样可以向页面输出源码,不会输出运行结果 #for循环 {% for i in urllist %} {{ i }} <a href="{{ i[0] }}" target="_blank"> {{ i[1]}}</a> {% end %} # while循环 {% set a = 0 %} #在调用while是时候需要定义a,这就需要使用set {% while a <5 %} {{ a }}<br> {% set a += 1 %} {% end %}} </body>
三、模板的转义
#如果给的是一个html文件,模板会不会解析
def post(self, *args, **kwargs): name = self.get_body_argument('name','no') urllist = [ ('http://www.baidu.com','去百度'), ('http://www.shiguangkey.com','去时光'), ('http://www.zhihu.com','去知乎') ] atga = """<a href="https://www.baidu.com" target="_blank"> _____走 去百度_____</a>""" #这是一个字符串 # self.write(name) self.render('lesson04_templates.html', username = name , time = time, urllist = urllist, atga = atga ) application = tornado.web.Application( handlers=[ (r'/tem',MainHandler), ], template_path = 'templates', autoescape = None, #在这里面加上这个也可以去除所有的转义 全局去转义 debug=True )
<!DOCTYPE html> {% autoescape None %} #对所有的内容都去除转义,不需要在下面再添加了,也可以在前民 模板级别去转义 <html lang="en"> <head>
<br> {{ atga}} #这样会直接把源码显示在网页中,不解析 ;会将字符串里面的标签转化为其它的符号,进而也就不解析了,但是显示在也页面的时候又会解析成原来的标签(这便就是转义) {% raw atga %} #加个一个raw 就可以解析(局部去除上面的转义)了 局部去转义 <br> {{ escape(atga) }} #这样依然会转义
四、静态文件引用
#有时候需要返回一些图片,那么如何返回这些静态文件呢 #1、先导入图片,放到static/images/ 2、然后在application中设置好静态文件的路径 static_path='static' 3 、在html文件中用两种方法导入
application = tornado.web.Application( handlers=[ (r'/tem',MainHandler), ], template_path = 'templates', static_path= 'static', #标准写法,设置静态文件的路径 autoescape = None, debug=True )
{% if username != 'no' %} 欢迎{{ username}} 登录 <img src="{{ static_url('images/1.jpg')}}" width="250" height="250"> #这两者的区别在于url不同,再次请求是,这个路径会直接在缓存中找图片,不用重新下载,效率更高一点 #使用此方法时,tornado会自动给静态文件添加版本号,如果版本号更改了,浏览器会自动地缓存新的文件 <img src="static/images/1.jpg" width="250" height="250"> #在tornado模块中,static是个关键字,能够自动替换成static_path后的内容 {% end %} </body>