Tornado

一个轻量级的Web框架

简介

1.Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使得其成为一个拥有非常高性能的框架。
此外,它还拥有处理安全性、用户验证、社交网络以及与外部服务(如数据库和网站API等)进行交互的工具

2.Tornado主要解决高并发问题,在处理高并发上,它采用异步的方式,通常能支持高于10K的并发

tornado安装

 pip install tornado

简单实用代码示例

# -*- coding: utf-8 -*-
__author__ = 'CQ' import textwrap
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import torndb
import os
from Tornado import databases_share # 自定义功能更强大的SQL操作 from tornado.options import define, options define("port", default=8888, help="run on the given port", type=int) def use_database():
"""
使用tornado原生的SQL模块
:return:
"""
db = torndb.Connection(host="127.0.0.1", database="test", user="root", password="")
a = db.get('select * from node where id=5 ') # get 只能返回一行数据,且是字典格式,返回多行将报错
print(a) b = db.query('select * from node') # query 返回是列表格式的数据,能够返回多条,且每个列表项是一个字典
print(b) exec_str = "insert into user(name,age,gender) values ('%s','%s','%s')" % ("张三", "", "男")
res = db.execute(exec_str)
print(res) class ReverseHandler(tornado.web.RequestHandler): def get(self, input):
self.write(input[::-1] + '\n') def head(self):
self.set_status(200) # 返回指定状态码 class WrapHandler(tornado.web.RequestHandler): def post(self):
text = self.get_argument('text')
width = self.get_argument('width', 40)
self.write(textwrap.fill(text, int(width)) + '\n') def write_error(self, status_code, **kwargs):
self.write("Gosh darnit, user! You caused a {0} error.\n".format(
status_code)) if __name__ == "__main__":
tornado.options.parse_command_line()
SETTINGS = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
)
urls = [
(r"/reverse/(\w+)", ReverseHandler),
(r"/wrap", WrapHandler)
]
app = tornado.web.Application(
handlers=urls,
**SETTINGS,
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

使用自定制SQL操作模块

# -*- coding: utf-8 -*-
__author__ = 'CQ' import pymysql
import logging logger = logging.getLogger(__name__) class MysqlServer(object):
"""
Tornado通用连接数据库类
用pymysql替代tornado使得操作数据库更加灵活,定制化
""" def __init__(self, db_config):
try:
self._db_config = db_config
self._conn = self.__get_conn()
self._cursor = self._conn.curson()
except Exception:
self.close()
logger.exception(u"数据库连接失败") def __get_conn(self):
connection = pymysql.connect(host=self._db_config['HOST'],
port=self._db_config['PORT'],
user=self._db_config['USERNAME'],
password=self._db_config['PASSWORD'],
db=self._db_config['DB_NAME'],
charset=self._db_config['CHAR_SET'],
)
connection.ping(True)
return connection def ensure_cursor(self):
if not self._cursor:
if not self._conn:
self._conn = self.__get_conn()
self._cursor = self._conn.cursor() def run_sql(self, sql):
"""
执行完SQL语句需要返回结果
:param sql:
:return:
"""
self.ensure_cursor()
self._cursor.execute(sql)
# commit只对innodb生效,不加commit的话,修改数据库记录的操作不会生效。
# 如果是myisam引擎的话,不需要commit即可生效
self._conn.commit()
return self._cursor.fetchall() def execute_sql(self, sql):
"""
执行SQL语句无返回值
:param sql:
:return:
"""
self.ensure_cursor()
self._cursor.execute(sql)
self._conn.commit() def run_sql_fetchone(self, sql):
"""
执行SQL返回一条结果
:param sql:
:return:
"""
self.ensure_cursor()
self._cursor.execute(sql)
return self._cursor.fetchone() def close(self):
if self._cursor:
self._cursor.close()
if self._conn:
self._conn.close()
logger.info(u"关闭数据库连接") def test():
settings = {
'HOST': "127.0.0.1",
'PORT': "",
'USERNAME': "root",
'PASSWORD': "",
'DB_NAME': "test",
'CHAR_SET': "utf8",
}
db = MysqlServer(settings)
sql = "select distinct `node_name` from tb_node"
ret = db.run_sql(sql)
db.close()
return ret if __name__ == "__main__":
print(test())

tornado安全相关

1. 使用Cookie正确的用户登陆到网站,保证编写的后台管理程序不被非法访问

2. tornado的cookie使用加密签名来验证cookie的值有没有被服务器软件以外的人修改

3. 因为恶意脚本并不知道安全密钥,所以不能再应用不知情的情况下修改cookie,从而达到安全认证的目的

使用cookie做简单用户验证

# -*- coding: utf-8 -*-
__author__ = 'CQ' import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient import os
import json from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int) class BaseHandler(tornado.web.RequestHandler): def get_current_user(self):
return self.get_secure_cookie("username") # 将用户cookie解密在把值返回 class LoginHandler(BaseHandler): def get(self):
self.render('login.html') def post(self):
self.set_secure_cookie("username", self.get_argument("username"))
self.redirect("/") class WelcomeHandler(BaseHandler):
@tornado.web.authenticated # tornado Web自身提供,没有登录时,自动跳转到登录界面,做身份验证用的
def get(self):
self.render("welcome.html", username=self.current_user) class LogoutHandler(BaseHandler): def get(self):
self.clear_cookie("username")
self.redirect("/") if __name__ == "__main__":
settings = {
"template_path": os.path.join(os.path.dirname(__file__), "templates"),
# cookie不会以明文存储在客户端,而是用此字符串加密cookie,然后才存储在客户端
"cookie_secret": "AQAAALudVkKt/AYA0bLPykwXoIBRVYTO",
# 当用户没有登录时,tornado会自动跳转的登录URL请求用户登录
"login_url": "/login"
}
urls = [
(r'/', WelcomeHandler),
(r'/login', LoginHandler),
(r'/test', WelcomeHandler),
(r'/logout', LogoutHandler)
] app = tornado.web.Application(
handlers=urls,
**settings,
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

项目部署方式

 fastcgi方式
http方法

 

Tornado模块的更多相关文章

  1. Tornado模块分类

    Tornado模块分类 1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 t ...

  2. Tornado 模块概述

    Tornado模块分类 1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 t ...

  3. Tornado模块分类和各模块之间的关系

    1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 tornado.https ...

  4. Python学习---IO的异步[tornado模块]

    tornado是一个异步非阻塞的WEB框架.它的异步非阻塞实际上就是用事件循环写的. 主要体现在2点: 1. 作为webserver可以接收请求,同时支持异步处理请求.Django只能处理完成上一个请 ...

  5. 第二百六十七节,Tornado框架-分页封装模块

    Tornado框架-分页封装模块 框架引擎 #!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web # ...

  6. tornado web 框架的认识

    tornado 简介 1,概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的 ...

  7. tornado学习精要

    最简单的应用在程序的最顶部,我们导入了一些Tornado模块.虽然Tornado还有另外一些有用的模块,但在这个例子中我们必须至少包含这四个模块. 12341234包括了一个有用的模块(tornado ...

  8. 浅析tornado web框架

    tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Py ...

  9. tornado web框架

    tornado web框架 tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web ...

随机推荐

  1. 洛谷 [P1220] 关路灯

    本题是一道区间DP,很容易设计出状态, dp[i][j]代表关掉i到j的路灯所耗的电量,但是对于新到一个路灯来说,可以是原来直接来的,也可以是掉头来的,于是还需要添加一维 0代表在区间的左端,1代表在 ...

  2. 夏令营讲课内容整理 Day 4.

    本日主要内容就是搜索(打暴力 搜索可以说是OIer必会的算法,同时也是OI系列赛事常考的算法之一. 有很多的题目都可以通过暴力搜索拿到部分分,而在暴力搜索的基础上再加一些剪枝优化, 就有可能会拿到更多 ...

  3. 基于Citus和ASP.NET Core开发多租户应用

    Citus是基于PsotgreSQL的扩展,用于切分PsotgreSQL的数据,非常简单地实现数据“切片(sharp)”.如果不使用Citus,则需要开发者自己实现分布式数据访问层(DDAL),实现路 ...

  4. WPF项目学习.一

    WPF项目搭建 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案. 使用MVVM的优点是 数据和视图分离,双向绑定,低耦合,可重用行,相对独立 ...

  5. How to delete a VM with snapshots

    A note about error: "cannot delete inactive domain with snapshots" You cannot delete a VM ...

  6. Python 运算符,你了解多少?

    新年新气象,文档更新继续~ 一.什么是运算符? 之前我们有定义过变量,变量是用来存储数据的,存储的数据是为了运算,运算就会使用到运算符 举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为 ...

  7. Java——正则表达式

    题目: java中提供了对正则表达式的支持. 有的时候,恰当地使用正则,可以让我们的工作事半功倍! 如下代码用来检验一个四则运算式中数据项的数目,请填写划线部分缺少的代码. 注意:只填写缺少代码,不要 ...

  8. hihoCoder1330 数组重排

    题意 小Hi想知道,如果他每次都按照一种固定的顺序重排数组,那么最少经过几次重排之后数组会恢复初始的顺序? 具体来讲,给定一个1 - N 的排列 P,小Hi每次重排都是把第 i 个元素放到第 Pi个位 ...

  9. mybatis与spring的整合(使用sqlSession进行crud)

    上次介绍了用接口的方法极大的节省了dao层,只需通过 配置文件和接口就可以实现,这次介绍的是通过splsession来实现dao,这种方法比较灵活: 先不说,上配置文件: 1.web.xml < ...

  10. 自动化测试 selenium中WebDriver 和WebElement的区别

    之前在做UI自动化测试中 经常会用到  WebDriver  和 WebElement两个类   以前对这两个类总感觉有点傻傻分不清 昨天看了下之前下的代码  结合自己的理解  对着两个类的区别和关系 ...