1、Tornado文件的结构:

  1、Controllers控制器

  2、Models数据库操作

  3、Views前端显示

2、样例

#!/usr/bin/env python
# -*- coding: utf8 -*-
# __Author: "Skiler Hao"
# date: 2017/5/23 9:26
from tornado.ioloop import IOLoop
from tornado.web import Application
import tornado import tornado.ioloop
import tornado.web
# 从controllers导入别的handlers
from controllers.account import LoginHandler
from controllers.home import HomeHandler # 实例化一个Mainhandler来处理主页
class MainHandler(tornado.web.RequestHandler):
def get(self):
# self.write("Hello, world")
# self.render("main.html")
self.redirect('http://www.baidu.com') # 用户可以自定义方法在前端使用
import uimethods as mt
# 用户可以自定义类在前端使用
import uimodules as mm
from tornado import escape # 将一些额外的参数传递给application
settings = {
"template_path": 'views',
'cookie_secret': 'asdfpojaksdfyknasdfklasdf',
'ui_methods': mt,
'ui_modules': mm,
'static_path': 'static',
} # 实例化一个application
application = tornado.web.Application([
(r"/index", MainHandler),
(r"/login", LoginHandler),
(r"/home", HomeHandler),
], **settings) if __name__ == "__main__":
# 绑定端口
application.listen(8888)
# 启动服务
tornado.ioloop.IOLoop.instance().start()

app

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ tab(11) }} <!-- 自定义方法 -->
{% raw tab(11) %} <!-- 将tab(11)的结果不转义,该怎么显示就显示 --> {% module Custom(22) %} <!-- 调用用户的自定义类 --> <form action="/login" method="POST">
<input type="text" name="user"/>
<input type="password" name="pwd"/>
<input type="submit" value="提交" />{{msg}} <!-- 变量 -->
</form>
</body>
</html>

前端样例

from tornado import escape
def tab(request,val):
# 返回一段代码,会自动渲染成相应的内容
return '<h1>Hello World!</h1>'

UImethod

from tornado.web import UIModule
from tornado import escape class Custom(UIModule):
def css_files(self):
# 会在head部加上css样式文件
return "commons.css"
# 会在头部嵌入相应的css
def embedded_css(self):
return ".c1{display:none}"
# 会在body的底部,加上js文件
def javascript_files(self):
return "commons.js"
def embedded_javascript(self):
# 会在body的底部,加上js代码
return "function f1(){alert(123);}"
def render(self, val):
# return "老村长" # 渲染相应的内容
# return '<h1>老村长</h1>' # 渲染相应的内容,但是默认会转义
v = escape.xhtml_escape('<h1>老村长</h1>') # 不转义,前端必须加上raw
return v

UIModule

3、Tornado的扩展

  1. 定义的每个handler都会继承RequestHandler,RequestHandler在init方法后都会调用initialize方法,并未实现。这是一个hook,所以我们可以扩展实现更为强大的功能
  2. 深度继承的扩展
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
    # __Author: "Skiler Hao"
    # date: 2017/5/23 9:26
    import tornado.ioloop
    import tornado.web
    from controllers.account import LoginHandler
    from controllers.home import HomeHandler class Foo(tornado.web.RequestHandler):
    def initialize(self):
    self.A = 123 self.set_cookie(ag)
    # 调用其父类的initialize,把实例化对象传过来给Foo的父类的构造器
    super(Foo,self).initialize() class MainHandler(Foo):
    # 可以利用深度继承,来做一些进一步的封装,注意传给父类的self是自身的实例化对象
    def get(self):
    print(self.A)
    self.write("Hello, world") application = tornado.web.Application([
    (r"/index", MainHandler),
    ]) if __name__ == "__main__":
    application.listen(9999)
    tornado.ioloop.IOLoop.instance().start()

    深度继承样例

  3. Tornado只支持cookie,我们对其作进一步扩展,使其支持session功能
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
    # __Author: "Skiler Hao"
    # date: 2017/5/23 9:26
    import tornado.ioloop
    import tornado.web
    from controllers.account import LoginHandler
    from controllers.home import HomeHandler import time
    import hashlib # 内存存储
    class Cache(object):
    """
    将session保存在内存
    """
    def __init__(self):
    self.container = {} def __contains__(self, item):
    return item in self.container def initial(self,random_str):
    self.container[random_str] = {} def get(self,random_str,key):
    return self.container[random_str].get(key) def set(self,random_str,key,value):
    self.container[random_str][key] = value def delete(self,random_str,key):
    del self.container[random_str][key] def open(self):
    pass def close(self):
    pass def clear(self,random_str):
    del self.container[random_str] # MemCache存储,暂未实现,用户可自己写此类
    class Memcache(object):
    def __init__(self):
    pass def get(self,key):
    pass def set(self,key,value):
    pass def delete(self,key):
    pass def open(self):
    pass def close(self):
    pass # Redis存储,暂未实现,用户可自己写此类
    class Redis(object):
    def __init__(self):
    pass def get(self, key):
    pass def set(self, key, value):
    pass def delete(self, key):
    pass def open(self):
    pass def close(self):
    pass # 用户可自定义session的存储方式
    P = Cache class Session(object):
    def __init__(self,handler):
    self.handler = handler
    self.random_str = None
    self.session_db = P() # 实例化配置对应的存储类型
    self.session_db.open()
    # 去用户请求信息中获取session_id,如果没有,新用户
    client_random_str = self.handler.get_cookie('session_id')
    if not client_random_str:
    "新用户"
    self.random_str = self.create_random_str()
    self.session_db.initial(self.random_str)
    else:
    if client_random_str in self.session_db:
    "老用户"
    self.random_str = client_random_str
    else:
    "非法用户"
    self.random_str = self.create_random_str()
    self.session_db.initial(self.random_str)
    ctime = time.time()
    self.handler.set_cookie('session_id',self.random_str,expires=ctime+1800)
    self.session_db.close() def create_random_str(self):
    """
    专业创建随机字符串,基于时间,大家可以加点盐
    :return:
    """
    v = str(time.time())
    m = hashlib.md5()
    m.update(bytes(v,encoding='utf-8'))
    return m.hexdigest() def __setitem__(self, key, value):
    """
    更新用户cookie对应的session内容,可实现session['uuuuu']
    :param key:
    :param value:
    :return:
    """
    self.session_db.open()
    self.session_db.set(self.random_str,key,value)
    self.session_db.close()
    def __getitem__(self, key):
    """
    获取用户cookie对应的session内容,可实现session['uuuuu']
    :param key:
    :return:
    """
    self.session_db.open()
    v = self.session_db.get(self.random_str,key)
    self.session_db.close()
    return v
    def __delitem__(self, key):
    """
    删除用户cookie对应的session内容
    :param key:
    :return:
    """ self.session_db.open()
    self.session_db.delete(self.random_str,key)
    self.session_db.close() def clear(self):
    """
    清空用户cookie对应的session内容
    :return:
    """ self.session_db.open()
    self.session_db.clear(self.random_str)
    self.session_db.close() class SessionHandler(object):
    def initialize(self):
    # self是MainHandler对象
    self.session = Session(self) # 会把当前实例化的对象传进去
    super(SessionHandler,self).initialize() # 利用python的广度继承 class HomeHandler(SessionHandler,tornado.web.RequestHandler):
    """
    SessionHandler应该放在左边,因为SessionHandler利用了python的广度继承
    如果觉得麻烦可让SessionHandler继承RequestHandler,使其成为深度继承
    """
    def get(self):
    # 根据用户的cookie
    user = self.session['username']
    if not user:
    self.redirect("http://www.oldboyedu.com")
    else:
    self.write(user) class LoginHandler(SessionHandler,tornado.web.RequestHandler):
    # 登录的时候可根据表单提交,完成相应的增删改查
    def get(self):
    self.session['uuuuu'] = 'root'
    self.redirect('/home') class TestHandler(tornado.web.RequestHandler):
    def get(self):
    self.set_cookie('k1', 'vvv', expires=time.time()+20) class ShowHandler(tornado.web.RequestHandler):
    def get(self):
    self.write(self.get_cookie('k1')) application = tornado.web.Application([
    (r"/login", LoginHandler),
    (r"/home", HomeHandler),
    (r"/test", TestHandler),
    (r"/show", ShowHandler),
    ]) if __name__ == "__main__":
    application.listen(9999)
    tornado.ioloop.IOLoop.instance().start()

    给Tornado添加session模块

Tornado之实例和扩展的更多相关文章

  1. 阿里云给自己实例扩容-扩展分区和文件系统_Linux系统盘

    阿里云买了台服务器ecs 磁盘容量40g 发现已经用了30g了  赶紧扩容 进入 e'cs实例 进入左边菜单 存储与快照 然后选择右边的扩容 然后支付 成功后 进入服务器 df -h 发现怎么还是没变 ...

  2. 在一个验证form的实例中扩展jQuery.validate

    需求很简单,直接上图: 要验证表单上的3个input输入框的格式,要求如下: 主关键词情形1: 浙江 杭州 温州 主关键词情形2: 浙江|江苏|上海,但是不能用 空格和 | 混合用,也就是情形1和2不 ...

  3. 浅谈tornado项目应用设计

    一.预备知识 最近开始尝试做一些tornado商城项目,在开始之前需要引入一些项目设计知识,如接口,抽象方法抽象类,组合,程序设计原则等,个人理解项目的合理设计可增加其灵活性,降低数据之间的耦合性,提 ...

  4. Tornado实战项目(伪JD商城)

    预备知识 在之前tornado商城项目中,在开始之前需要引入一些项目设计知识,如接口,抽象方法抽象类,组合,程序设计原则等,个人理解项目的合理设计可增加其灵活性, 降低数据之间的耦合性,提高稳定性,下 ...

  5. centos 7.0 phpize 扩展php

    phpize扩展php模块 phpize 所在目录 /usr/etc/php/bin/phpize 查看当前php配置情况 /usr/etc/php/bin/下面的php [root@localhos ...

  6. jQuery的封装和扩展方式

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Tornado框架简介

    -------------------简介------------------- 1.概念:     Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器 ...

  8. ES6(三)数组的扩展

    1.Array.form ES6中,Array.from = function(items,mapfn,thisArg) {  }   Array.from 用于将 类数组 和 可遍历对象(实现了It ...

  9. windows应用程序框架及实例

    应用程序框架:同一类型应用程序的结构大致相同,并有很多相同的源代码,因此可以通过一个应用程序框架AFX(Application FrameWorks)编写同一类型应用程序的通用源代码. 主要向导: D ...

随机推荐

  1. 为什么我们选择parquet

    说明:此方案已经我们已经运行1年. 1.场景描述: 我们对客户登录日志做了数据仓库,但实际业务使用中有一些个共同点, A  需要关联维度表 B  最终仅取某个产品一段时间内的数据 C 只关注其中极少的 ...

  2. Git常用命令和Git团队使用规范指南

    转自:https://wsgzao.github.io/post/git/ 前言 在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git.它的出现改变了 ...

  3. Maven 三种archetype说明

    新建Maven project项目时,需要选择archetype. 那么,什么是archetype? archetype的意思就是模板原型的意思,原型是一个Maven项目模板工具包.一个原型被定义为从 ...

  4. Unity教程之-UGUI一个优化效率小技巧

    无意间发现了一个小技巧.如下图所示,可以发现UGUI的Image组件的RaycastTarget勾选以后会消耗一些效率,为了节省效率就不要勾选它了,不仅Image组件Text组件也有这样的问题. 一般 ...

  5. 理解OAuth 2.0授权

    一.什么是OAuth 二.什么场景下会用到OAuth授权 三.OAuth 2.0中的4个成员 四.OAuth 2.0授权流程 五.OAuth 2.0授权模式 1.    authorization c ...

  6. 【转】ftrace 简介

    ftrace 简介 ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析. 最早 ftrace 是一个 function tracer,仅能够记录内核的函数 ...

  7. msys git 安装配置、git命令行使用

    安装 .安装msys git客户端程序 .打开git bash,命令ssh-keygen –C “admin@test.cn “ –t rsa .复制C:\Users\felix\.ssh\id_rs ...

  8. Windows下查看占用端口程序

    配置shadowsocks,发现本地1080端口被占用,当然更改没有占用的端口即可.当然还得查找下什么程序占用的.无奈,看了下115浏览器占用此端口,浏览器不能管啊,你懂得!!! Windows查找下 ...

  9. Centos7下部署两套python版本并存

    Centos7下部署两套python版本并存   需求说明:centos7.2系统的开发机器上已经自带了python2.7版本,但是开发的项目中用的是python3.5版本,为了保证Centos系统的 ...

  10. 添加resx文件过程笔记

    为了测试资源文件,今天上午耗掉了.终于实现了,原来是要按照它自动建文件夹,不可以手动建.下图 见其他语言的时候一定要:Mytest.zh-CN.resx 这样,加上后缀名字 代码中获取资源 http: ...