一.UIMOTHODS:
代码语言:javascript复制1.在项目目录创建uimothods.py文件(名称可以任意)
内容:
代码语言:javascript复制def test2(self):
return ('hello uimothods')
2.tornado项目文件中导入并注册:
代码语言:javascript复制#导入
from utils import uimothods as mt
代码语言:javascript复制#注册
代码语言:javascript复制settings = {
'ui_modules': mt
}
3.在html中调用uimethod
{{test2()}}
二.UImodules:
代码语言:javascript复制1.在项目目录创建uimodules.py文件(名称可以任意)
代码语言:javascript复制from tornado.web import UIModule
from tornado import escape
class test(UIModule):
def render(self, *args, **kwargs):
return ('<h1>UIMODULES</h1>') #返回html文件,不转义
#return escape.xhtml_escape('<h1>UIMODULES</h1>') #对返回内容进行转义
def embedded_javascript(self):#在html中插入js
return 'a.js'
def embedded_css(self):#在html中插入css
return 'a.css'
View Code
代码语言:javascript复制2.tornado项目文件中导入并注册:
代码语言:javascript复制#导入
from utils import uimodules as md
#注册
代码语言:javascript复制settings = {
'ui_modules': md
}
3.在html中调用uimodules
代码语言:javascript复制{% module test(123) %}
二者区别:uimothods用函数定义,uimodule用类的方式定义,且可以返回时直接在模板加入js/css等
代码语言:javascript复制二。html转意。
1.在uimodule中可以用:
from
代码语言:javascript复制tornado import escape
代码语言:javascript复制escape.xhtml_escape('<h1>wupeiqi</h1>')
2.在html中可以直接使用raw
{{ raw test}}
#1.全局转义,在Application中添加配置项
代码语言:javascript复制autoescape=None,
#2.在文档最开始添加
代码语言:javascript复制{% autoescape None %} #实现整个文档转义
#在开启全局和文档不转义的情况下,可以使用 escape() 来开启变量的转义
代码语言:javascript复制{{ atag }}
{{ escape(atag) }}
#3.也可以使用 {% raw xxx %} 来输出不转义内容
代码语言:javascript复制{% raw atag %}
tornado是默认自动开启转义的,大家可以根据需求来选是否转义,但是要知道转义的本意是来防止浏览器意外执行恶意代码的,所以去掉转义的时候需要谨慎选择
开发简单tornado Form功能
VIEW代码:
代码语言:javascript复制import re
import tornado.web
class EmailField:
def __init__(self,name):
self.name=name
self.value=''
self.error=''
self.reg=". @. .(com|cn)$"
def __str__(self):
return '<input type="text" value="%s" name="%s">'%(self.value,self.name)
class TextField:
def __init__(self,name):
self.name=name
self.value=''
self.error=''
self.reg=". "
def __str__(self):
return '<input type="text" value="%s" name="%s">'%(self.value,self.name)
class LoginForm:
def __init__(self):
self.email=EmailField('email')
self.username=TextField('username')
def is_valid(self,request):
value_dict={}#将用户通过校验的值保存到字典中
flags=True
for k,v in self.__dict__.items():
user_input=request.get_body_argument(k) #获取用户输入的值
if re.match(v.reg,user_input): #正则匹配用户输入的值
value_dict[k]=user_input
else:
flags=False #如果有一条匹配失败,结果返回false
if user_input =='':
v.error='%s字段不能为空'%k
else:
v.error='请输入正确的格式!'
v.value=user_input #如果用户输入错误将用户的输入返回到页面上!(保留错误结果)
return flags,value_dict #返回数据正则匹配结果及用户正则匹配成功的字段
class login(tornado.web.RequestHandler):
def get(self, *args,**kwargs):
obj=LoginForm()
self.render('login.html',**{'obj':obj})
def post(self, *args, **kwargs):
obj=LoginForm()
res,val=obj.is_valid(self)
if res:
print('用户输入的正确数据',val)
self.write('数据已提交成功!')
else:
self.render('login.html',**{'obj':obj})
settings={
'template_path':'template'
}
application=tornado.web.Application([
(r'/login',login),
],**settings)
if __name__ == '__main__':
application.listen(80)
tornado.ioloop.IOLoop.instance().start()
View Code
前端代码:
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="POST">
<p>username{% raw obj.username %}{{obj.username.error}}</p>
<p>email{% raw obj.email %}{{obj.email.error}}</p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
View Code