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. Hadoop学习笔记五

    一.uber(u:ber)模式 MapReduce以Uber模式运行时,所有的map,reduce任务都在一个jvm中运行,对于小的mapreduce任务,uber模式的运行将更为高效. uber模式 ...

  2. POJ 3683 Priest John's Busiest Day[2-SAT 构造解]

    题意: $n$对$couple$举行仪式,有两个时间段可以选择,问是否可以不冲突举行完,并求方案 两个时间段选择对应一真一假,对于有时间段冲突冲突的两人按照$2-SAT$的规则连边(把不冲突的时间段连 ...

  3. Win10编译SqlCipher步骤

    准备工作 Visual Studio 2015,其他版本未验证,估计问题不大 ActiveState ActivePerl,用于编译OpenSSL Mingw,在官网下载minimum install ...

  4. 【模板小程序】求小于等于N范围内的质数

    //筛法求N以内的素数(普通法+优化),N>=2 #include <iostream> #include <cmath> #include <vector> ...

  5. Matlab中图论工具箱的应用

    Matlab图论工具箱的命令见表1 表1  matlab图论工具箱的相关命令 命令名 功能 graphallshortestpaths 求图中所有顶点对之间的最短距离 graphconncomp 找无 ...

  6. python中常见的三种句型if,while,for

    1.if语句: 特别说明:条件后面的冒号不能少,同样必须是英文字符. 特别特别说明:if内部的语句需要有一个统一的缩进,一般用4个空格.python用这种方法替代了其他很多编程语言中的{}. num= ...

  7. CocosCreator游戏开发---菜鸟学习之路(一)

    PS(废话): 辞职后在家好久好久了,久到经济不允许了,接着就准备再次出去找工作了,然而工作哪有那么好找,特别是像我这种菜鸟.而且我还准备转行,准备去做游戏,技能等级接近于0,那工作就更难找了.既然如 ...

  8. javascript Map和Set

    Map和Set JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对. 但是JavaScript的对象有个小问题,就是键必须是字符串.但实 ...

  9. ansible实践2-拷贝文件或目录

      ansible testhost -m copy -a "src=/etc/ansible  dest=/tmp/ansibletest owner=root group=root mo ...

  10. PHP入门学习精要

    一.文件名 函数.配置文件等其他类库文件之外的一般是以.php为后缀(第三方引入的不做要求): ThinkPHP的模板文件默认是以.html 为后缀(可以通过配置修改): 二.其它命名 其它命名 规则 ...