tornado学习笔记

2020-01-19 15:48:34 浏览数 (1)

一.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

0 人点赞