Python web框架之tornado的使用
作者:太阳打伞
什么是Tornado
https://github.com/tornadoweb/tornado
tornado是Python界中非常出名的一款Web框架,和Flask一样它也属于轻量级的Web框架。
Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器兼Web应用框架,由FriendFeed公司在自己的网站FriendFeed中使用,被Facebook收购以后框架在2009年9月以开源软件形式开放给大众。
但是从性能而言tornado由于其支持异步非阻塞的特性所以对于一些高并发的场景显得更为适用。
tornado简洁,高效,能够支持WebSocket,其I/O多路复用采用epoll模式来实现异步,并且还有Future期程对象来实现非阻塞。
Tornado有着优异的性能。它试图解决C10k问题,即处理大于或等于一万的并发。
Django、Flask、Tornado的对比,以及tornado应用场景
Django:
优点:大而全的框架,全自动化的管理后台带来超高的开发效率,丰富的组件
缺点:厚重,与他自己的ORM高耦合
分析:Django提供的方便,也意味着Django内置的ORM跟框架内的其他模块耦合程度高。应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利;理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修。Django的卖点是超高的开发效率,其性能扩展有限。
总结:成熟,稳定,开发效率高,相对于Flask,Django的整体封闭性比较好,适合做企业级网站的开发。python web框架的先驱,第三方库丰富。
Tornado:
优点:轻量、异步非阻塞IO处理方式、出色的抗负载能力、协程带来优异的处理性能
缺点:没有ORM,提供的支持和模板少,缺少后台支持,对小型项目来说开发速度没有django快
分析:tornado所谓的“缺点”是由它的设计理念决定的,设计上就决定它是一个小而精的http服务器+轻量级web框架,高并发处理才是它真正擅长的
总结: tornado的并发性能最好,而且最为轻量级,它最出名的异步非阻塞的设计方式,性能强悍是 Tornado 的名片。
django大而全、flask小而精、tornado性能高。
django ORM虽然面向对象来操作数据库,但是它的效率很低,使用外键来联系表与表之间的查询。
相比于Django和Flask,Tornado的市场占有率可以说是极低的,三个框架的特点很明显。
python在做web方面可不是一个主力军,更多被用来做一些小型企业门户网站或者工具网站,要高并发干啥,基本没有用武之地啊。真要冲着大并发的业务去,也不会选python来做web啊。所以,我觉得这就是Tornado不怎么受欢迎的原因。
tornado主要是用于websocket/tcp这些长连接数据流的场景, 结合async非常好用, python语言里暂时应该没有更好的替代框架, 如果是CRUD的web或者restful接口, 那确实跟django/django-rest-framework那些比完全没有优势。
总结:tornado主要应用场景还是用于websocket/tcp这些长连接数据流的场景, 结合async非常好用, python语言里暂时应该没有更好的替代框架。
安装
输入命令:
pip install tornado
使用
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()
到此这篇关于Python web框架之tornado的使用的文章就介绍到这了,更多相关Python tornado内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!