Python web框架之tornado的使用

 更新时间:2023年05月16日 09:35:40   作者:太阳打伞  
tornado是一个用Python语言写成的Web服务器兼Web应用框架,本文主要介绍了Python web框架之tornado的使用,具有一定的参考价值,感兴趣的可以了解一下

什么是Tornado

官网:www.tornadoweb.org/

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pandas中DataFrame的merge操作的实现

    pandas中DataFrame的merge操作的实现

    本文主要介绍了pandas中DataFrame的merge操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • python机器学习基础K近邻算法详解KNN

    python机器学习基础K近邻算法详解KNN

    这篇文章主要为大家介绍了python机器学习基础K近邻算法详解有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • 使用python实现定时报天气的示例代码

    使用python实现定时报天气的示例代码

    本文主要介绍了使用python实现定时报天气,只需要让爬虫程序每天自动为你发送,下面就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-11-11
  • vscode中配置jupyter的详细步骤(彻底解决Failed to start the Kernel问题)

    vscode中配置jupyter的详细步骤(彻底解决Failed to start the Kernel问题)

    自从vscode出了支持jupyter notebook的功能之后,我就再也没有傻傻的用浏览器开过jupyter(问就是vscode好看),下面这篇文章主要给大家介绍了关于vscode中配置jupyter(彻底解决Failed to start the Kernel问题)的相关资料,需要的朋友可以参考下
    2022-12-12
  • Python实现自动识别数字验证码

    Python实现自动识别数字验证码

    这篇文章主要为大家详细介绍了如何使用Python来自动识别数字验证码,以便在需要时自动填写或验证验证码,有需要的小伙伴可以参考一下
    2024-04-04
  • python matlibplot绘制3D图形

    python matlibplot绘制3D图形

    这篇文章主要为大家详细介绍了python matlibplot绘制3D图形,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • PyCharm中鼠标悬停在函数上时显示函数和帮助的解决方法

    PyCharm中鼠标悬停在函数上时显示函数和帮助的解决方法

    这篇文章主要介绍了PyCharm中鼠标悬停在函数上时显示函数和帮助,本文给大家分享问题解决方法,对PyCharm鼠标悬停函数上显示函数的解决方法感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • Python实现随机生成一个汉字的方法分享

    Python实现随机生成一个汉字的方法分享

    这篇文章主要为大家详细介绍了Python如何实现随机生成一个汉字的功能,文中的示例代码讲解详细,对我们深入了解Python有一定的帮助,需要的可以参考一下
    2023-01-01
  • pytorch教程之网络的构建流程笔记

    pytorch教程之网络的构建流程笔记

    这篇文章主要介绍了pytorch教程中网络的构建流程,文中附含了详细的示例代码流程,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • 详解pytest中runtestprotocol方法的实现

    详解pytest中runtestprotocol方法的实现

    runtestprotocol 是 pytest 执行测试流程中的一个核心函数,它主要负责调用测试函数的“setup”、“call”和“teardown”钩子函数,并生成对应的测试报告,本文将深入探究pytest中runtestprotocol方法的实现,需要的朋友可以参考下
    2023-10-10

最新评论