1.Tornado
中文文档https://tornado-zh.readthedocs.io/zh/latest/
- Tornado:python编写的web服务器兼web应用框架
1.Tornado的优势
- 轻量级web框架
- 异步非阻塞IO处理方式
- 出色的抗负载能力
- 优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题
- WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器
2.Tornado VS Django
- Django:重量级web框架,功能大而全,注重高效开发
- 内置管理后台
- 内置封装完善的ORM操作
- session功能
- 后台管理
- 缺陷:高耦合
- Tornado:轻量级web框架,功能少而精,注重性能优越
- HTTP服务器
- 异步编程
- WebSocket
- 缺陷:入门门槛较高
2.安装
输入命令:
pip install tornado
备注:
Tornado应该运行在类Unix平台,为了达到最佳的性能和扩展性,仅推荐Linux和BSD(充分利用Linux的epoll工具和BSD的kqueue达到高性能处理的目的)
3.使用
1.Tornado入门程序
db.py
# 数据库工具类
import peewee
import peewee_async
from datetime import datetime
# 创建数据库链接对象
database = peewee_async.PooledMySQLDatabase("scoial", host="127.0.0.1",
port=3306, user="root", password="123456")
# 基类
class BaseModel(peewee.Model):
id = peewee.IntegerField(primary_key=True, unique=True, constraints=
[peewee.SQL('AUTO_INCREMENT')])
# 入库时间
create_time = peewee.DateTimeField(default=datetime.now,
help_text="入库时间")
# 重写父类方法
def save(self, *args, **kwargs):
# 判断什么时候赋值入库方法
if self._pk is None:
# 赋值
self.create_time = datetime.now()
return super(BaseModel, self).save(*args, **kwargs)
class Meta:
# 传递数据库连接
database = database
# 用户表
class UserModel(BaseModel):
email = peewee.CharField(null=False, unique=True, max_length=100)
password = peewee.CharField(null=False, max_length=567)
state = peewee.IntegerField(null=False, default=0)
class Meta:
# 声明表明
db_table = "user"
if __name__ == '__main__':
# 创建表
UserModel.create_table(True)
# 删除表
# UserModel.drop_table(True)
# 添加测试数据
main.py
import tornado.ioloop
import tornado.web
import redis
# 导入基础类
from base import BaseHandler
# 导入数据库操作类
from db import database
import os
from tornado.options import define, options
define('port', default=8000, help='default port',type=int)
import peewee_async
# import aioredis
import asyncio
# 导入用户模块
import user
# 设置tornado静态文件夹目录
static_path = os.path.join(os.path.dirname(__file__),"static")
class TestHandler(BaseHandler):
async def get(self):
self.finish({"msg":"hello Tornado"})
# 集成路由
urlpatterns = [(r'/',TestHandler)]
urlpatterns += (user.urlpatterns)
app = tornado.web.Application(
handlers=urlpatterns,static_path=static_path,debug=True
)
# 将数据库连接注入到事件循环中
app.objects = peewee_async.Manager(database)
app.redis = redis.Redis(password='123',decode_responses=True)
# 将异步redis链接注入到事件循环
# async def redis_pool(loop):
#
# return await aioredis.create_redis_pool('localhost',minsize=1,
# maxsize=1000,encoding='utf8',loop=loop)
#
# loop = asyncio.get_event_loop()
# app.redis = loop.run_until_complete(redis_pool(loop))
# app.objects = peewee_async.Manager(database)
if __name__ == "__main__":
print("开启服务")
tornado.options.parse_command_line()
app.listen(options.port)
tornado.ioloop.IOLoop.instance().start()