视图部分就是负责产生前端html页面
为了便于管理,统一放在views文件夹中(详见提纲)
需要在settings
中添加: "template_path":'views',
Tornao中的模板语言和django中类似,模板引擎将模板文件载入内存,然后将数据嵌入其中,最终获取到一个完整的字符串,再将字符串返回给请求者。
这里需要注意的一点
是前端如果有模板文件,则Tornado后端必须传入,否则报错,而在django中则不会
Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{ items[0] }}。
即Toanado表达语句和python原有语法一致,而非django中万能的句点号
控制语句和对应的 Python 语句的格式基本完全相同。我们支持 if、for、while 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。
即Toanado控制语句也和python语句格式大体相同,逻辑结束位置统一用 {% end %} 做标记,这又和Django对应结束不同
Tornado也通过 extends 和 block 语句实现了模板继承
Django为模板提供了一些默认的过滤器(filter)和标签(tag)
Tornado也默认提供了一些函数、字段、类以供模板使用
Django可以自定制filter和simple_tag
Tornado也可以自定制一些
说明一点:settings中添加’autoescape’:None,会将所有html字符串渲染,如此容易受到XSS攻击,一般不用
一,定义
# uimethods.py
def tab(self):
return '<h1>UIMethod</h1>'
#uimodules.py
from tornado.web import UIModule
from tornado import escape
class custom(UIModule):
def render(self, *args, **kwargs):
# return ("啦啦啦")
#return ("<h1>啦啦啦</h1>")
# return escape.xhtml_escape('啦啦啦')
return escape.xhtml_escape('<h1>啦啦啦</h1>')
def embedded_css(self):
return ".c1{display:None}"
def css_files(self):
return "commens.css"
def embedded_javascript(self):
return "commens.js"
def javascript_files(self):
return "function f1(){alert(123)}"
二,注册
import uimodules as md
import uimethods as mt
'''settings中添加
'ui_methods': mt,
'ui_modules': md,'''
三,使用
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<link href="{{static_url("commons.css")}}" rel="stylesheet" />
</head>
<body>
<h1>hello</h1>
{% module custom() %}
{{ tab() }}
{% raw tab() %}
</body>
两者可以前端直接传参
uimethods,默认不渲染html字符串,但可通过前端改变形式使其渲染
{{ tab() }} :不渲染
{% raw tab() %} :渲染
uimodules,默认自动渲染html字符串,但可以通过escape.xhtml_escape
方法使不渲染
除此之外,nimoduls还可以导入css/js代码或文件,需要新建文件夹static
在settings添加’static_path':"static"
补充一点:模板是如何渲染的,、
采用的是字符串分隔,把html文件当成一个大的字符串,从头开始走,遇到模板语言就停,作为一部分,把模板语言作为一部分,拿到相应数据在显示,之后继续按照这个模式,把html字符串一块一块分着处理