Tornado 概述
Tornado 概述
1 基本概念
像其他web框架一样, tornado也包括了以下内容:
基本构成:
a 路由系统
b 视图
获取请求数据
返回数据
c 模板语言
模板基本使用
自定义函数
利用组件自己完成 分页, 中间件等扩展功能
概念
Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。
这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。
特点
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接。
对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。
开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)
2 简单应用
(1) 登录页面的小实例:
import tornado.ioloop
import tornado.web
class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.render('login.html') # 渲染template
settings = {
'template_path':'templates',
'static_path':'static',
'static_url_prefix':'/stat/', # 静态文件 url
}
# 配置模板文件路径
application = tornado.web.Application(
[(r"/login",LoginHandler),],**settings # 配置文件
)
if __name__ == '__main__':
# 创建socket对象
application.listen(8001)
# conn,add = socket.accept()
tornado.ioloop.IOLoop.instance().start()
# 1 执行脚本,监听 8000 端口
# 2 浏览器客户端访问 /index --> http://127.0.0.1:8000/index
# 3 服务器接受请求,并交由对应的类处理该请求
# 4 类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法
# 5 方法返回值的字符串内容发送浏览器

像Django中的
{% load static from staticfiles %}
{% static 'main.css'% }
flask中
{{url_for('static',filename='main.css')}}
tornado 也支持 静态文件的反向查找
{{static_url('main.css')}}

(2) csrf 配置
settings = {
'xsrf_cookies':True
}
{% raw xsrf_from_html() %} # 使用
(3) 请求数据
self.get_query_argument('page') # get params数据
self.get_body_argument('username') # post form数据
self.get_argument('username')
self.get_argument('page') # 所有数据都可以获取
def post(self):
usrname = self.get_argument('username')
pwd = self.get_argument('pwd')
print(usrname,pwd)
if usrname == 'root' and pwd == '123':
self.redirect('http://google.com')
return
self.write('post')
(4) 模板语言
self.render('login.html',**{'msg':'用户密码有误'})
self.render('index.html',user_list=user_list,user_dict=user_dict)
python 语法:
{{msg}} #注意: msg为空,在后端也得声明 msg = ''
<ul>
{% for item in user_list %}
<li>{{item}}</li>
{% end %}
</ul>
{{ user_list[0] }}
{{ user_dict['id'] }}
{{ user_dict.get('name') }}
(5) cookie设置
**普通cookie**
self.set_cookie('user',username)
self.get_cookie('user')
**加密cookie**
设置 settings = {
'cookie_secret':'salt'
}
self.set_secure_cookie('user',username)
self.get_secure_cookie('user',username)
代码实例:
import tornado.ioloop
import tornado.web
class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.render('login.html',msg='') # 渲染template
def post(self):
username = self.get_argument('username')
pwd = self.get_argument('pwd')
if username == 'root' and pwd == '123':
self.set_cookie('user',username)
self.redirect('/index')
return
self.render('login.html',**{'msg':'用户密码有误'})
class IndexHandler(tornado.web.RequestHandler):
def get(self):
if self.get_cookie('user'):
user_list = [
'james','kobe'
]
user_dict = {
'id':1,'name':'cp3'
}
self.render('index.html',user_list=user_list,user_dict=user_dict)
return # 直接 return 返回(推荐写法)
self.redirect('/login')
settings = {
'template_path':'templates',
'static_path':'static',
'static_url_prefix':'/stat/', # 静态文件 url
# 'xsrf_cookies':True, # csrf
}
# 配置模板文件路径
application = tornado.web.Application([
(r"/login",LoginHandler),
(r"/index",IndexHandler),
],**settings # 配置文件
)
if __name__ == '__main__':
# 创建socket对象
application.listen(8000)
# conn,add = socket.accept()
tornado.ioloop.IOLoop.instance().start()
(6) 通过tornado请求入口,在请求处理前,封装一些数据

class AuthHandler(tornado.web.RequestHandler):
def initialize(self):
self.username = self.get_secure_cookie('user')
# 初始化的时候
def prepare(self):
pass
# 执行_excute 方法
class LoginHandler(AuthHandler):
# @cookie_auth 判断self.username 是否有值
def get...
if self.username:(当然这里的判断 可以通过装饰来实现)
...
Tornado 概述的更多相关文章
- Python框架之Tornado(概述)
本系列博文计划: 1.剖析基于Python的Web框架Tornado的源码,为何要阅读源码? Tornado 由前 google 员工开发,代码非常精练,实现也很轻巧,加上清晰的注释和丰富的 demo ...
- python web框架——初识tornado
一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...
- 浅析tornado web框架
tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Py ...
- tornado web框架
tornado web框架 tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web ...
- 01: tornado基础篇
目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 Torn ...
- Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...
- 国内某Python大神自创完整版,系统性学习Python
很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基 ...
- Tornado之架构概述图
一.Tornado之架构概述图 二.Application类详细分析: #!/usr/bin/env python # -*- coding: utf8 -*- # __Author: "S ...
- Tornado 模块概述
Tornado模块分类 1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 t ...
随机推荐
- 在使用Kafka过程中遇到的错误
问题一:用kafka命令发送消息时候,一直报WARN Error while fetching metadata with correlation id 0 : {test=UNKNOWN_TOPIC ...
- 20145321 《Java程序设计》第3周学习总结
20145321 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 4.1 类与对象 1.定义类:类定义时用关键词 class. 一个原始码中可以有多个类定义,但只能有一个公开 ...
- 0ctf2017-pages-choices
Pages 题目来自于CCS 2016 <Prefetch Side-Channel Attacks: Bypassing SMAP and Kernel ASLR>,利用intel pr ...
- MiniTools在ubuntu下快捷方式
解压MiniTools-Linux-20140317.tgz root@ubuntu:~/tiny4412/MiniTools-20140317# ls -l total 38008 -rw-r--r ...
- RMI远程方法调用
RMI远程方法调用:适用于 客户端 调用 服务器 内的方法:(Kotlin 语言编写) 如果业务为二个服务器之间的通信,还是得用消息队列的形式,因为RMI 不适合 双向 调用 下面介绍RMI 的使用方 ...
- 04_zookeeper客户端使用及常用命令
zookeeper客户端的使用 (1) 首先找到zookeeper自带客户端的位置 简单来说,zookeeper自带客户端位于zookeeper安装目录的bin目录下,以我的为例: (2) 运 ...
- centos7 systemctl一些用法
systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体. systemctl is-enabled servicename.service #查询服务是否 ...
- angular指令中的scope绑定策略
针对独立 scope,可以通过在对象中声明如何从外部传入参数.有以下三种绑定策略: @ - 使用 DOM 属性值单项绑定到指令 scope 中.此时绑定的值总是一个字符串,因为 DOM 的属性值是一个 ...
- Dubbo 和 Spring Cloud微服务架构 比较及相关差异
你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构. 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务, ...
- MySQL之长连接、短连接、连接池
当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信.客户端必须使用数据库连接来发送命令和接收应答.数据.通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了. ...