Python web框架之tornado的使用
什么是Tornado
官網(wǎng):www.tornadoweb.org/
https://github.com/tornadoweb/tornado
tornado是Python界中非常出名的一款Web框架,和Flask一樣它也屬于輕量級(jí)的Web框架。
Tornado全稱Tornado Web Server,是一個(gè)用Python語言寫成的Web服務(wù)器兼Web應(yīng)用框架,由FriendFeed公司在自己的網(wǎng)站FriendFeed中使用,被Facebook收購以后框架在2009年9月以開源軟件形式開放給大眾。
但是從性能而言tornado由于其支持異步非阻塞的特性所以對(duì)于一些高并發(fā)的場(chǎng)景顯得更為適用。
tornado簡(jiǎn)潔,高效,能夠支持WebSocket,其I/O多路復(fù)用采用epoll模式來實(shí)現(xiàn)異步,并且還有Future期程對(duì)象來實(shí)現(xiàn)非阻塞。
Tornado有著優(yōu)異的性能。它試圖解決C10k問題,即處理大于或等于一萬的并發(fā)。
Django、Flask、Tornado的對(duì)比,以及tornado應(yīng)用場(chǎng)景
Django:
優(yōu)點(diǎn):大而全的框架,全自動(dòng)化的管理后臺(tái)帶來超高的開發(fā)效率,豐富的組件
缺點(diǎn):厚重,與他自己的ORM高耦合
分析:Django提供的方便,也意味著Django內(nèi)置的ORM跟框架內(nèi)的其他模塊耦合程度高。應(yīng)用程序必須使用Django內(nèi)置的ORM,否則就不能享受到框架內(nèi)提供的種種基于其ORM的便利;理論上可以切換掉其ORM模塊,但這就相當(dāng)于要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做全新的裝修。Django的賣點(diǎn)是超高的開發(fā)效率,其性能擴(kuò)展有限。
總結(jié):成熟,穩(wěn)定,開發(fā)效率高,相對(duì)于Flask,Django的整體封閉性比較好,適合做企業(yè)級(jí)網(wǎng)站的開發(fā)。python web框架的先驅(qū),第三方庫豐富。
Tornado:
優(yōu)點(diǎn):輕量、異步非阻塞IO處理方式、出色的抗負(fù)載能力、協(xié)程帶來優(yōu)異的處理性能
缺點(diǎn):沒有ORM,提供的支持和模板少,缺少后臺(tái)支持,對(duì)小型項(xiàng)目來說開發(fā)速度沒有django快
分析:tornado所謂的“缺點(diǎn)”是由它的設(shè)計(jì)理念決定的,設(shè)計(jì)上就決定它是一個(gè)小而精的http服務(wù)器+輕量級(jí)web框架,高并發(fā)處理才是它真正擅長的
總結(jié): tornado的并發(fā)性能最好,而且最為輕量級(jí),它最出名的異步非阻塞的設(shè)計(jì)方式,性能強(qiáng)悍是 Tornado 的名片。
django大而全、flask小而精、tornado性能高。
django ORM雖然面向?qū)ο髞聿僮鲾?shù)據(jù)庫,但是它的效率很低,使用外鍵來聯(lián)系表與表之間的查詢。
相比于Django和Flask,Tornado的市場(chǎng)占有率可以說是極低的,三個(gè)框架的特點(diǎn)很明顯。
python在做web方面可不是一個(gè)主力軍,更多被用來做一些小型企業(yè)門戶網(wǎng)站或者工具網(wǎng)站,要高并發(fā)干啥,基本沒有用武之地啊。真要沖著大并發(fā)的業(yè)務(wù)去,也不會(huì)選python來做web啊。所以,我覺得這就是Tornado不怎么受歡迎的原因。
tornado主要是用于websocket/tcp這些長連接數(shù)據(jù)流的場(chǎng)景, 結(jié)合async非常好用, python語言里暫時(shí)應(yīng)該沒有更好的替代框架, 如果是CRUD的web或者restful接口, 那確實(shí)跟django/django-rest-framework那些比完全沒有優(yōu)勢(shì)。
總結(jié):tornado主要應(yīng)用場(chǎng)景還是用于websocket/tcp這些長連接數(shù)據(jù)流的場(chǎng)景, 結(jié)合async非常好用, python語言里暫時(shí)應(yīng)該沒有更好的替代框架。
安裝
輸入命令:
pip install tornado
使用
Tornado入門程序
db.py
# 數(shù)據(jù)庫工具類 import peewee import peewee_async from datetime import datetime # 創(chuàng)建數(shù)據(jù)庫鏈接對(duì)象 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')]) # 入庫時(shí)間 create_time = peewee.DateTimeField(default=datetime.now, help_text="入庫時(shí)間") # 重寫父類方法 def save(self, *args, **kwargs): # 判斷什么時(shí)候賦值入庫方法 if self._pk is None: # 賦值 self.create_time = datetime.now() return super(BaseModel, self).save(*args, **kwargs) class Meta: # 傳遞數(shù)據(jù)庫連接 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__': # 創(chuàng)建表 UserModel.create_table(True) # 刪除表 # UserModel.drop_table(True) # 添加測(cè)試數(shù)據(jù)
main.py
import tornado.ioloop import tornado.web import redis # 導(dǎo)入基礎(chǔ)類 from base import BaseHandler # 導(dǎo)入數(shù)據(jù)庫操作類 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 # 導(dǎo)入用戶模塊 import user # 設(shè)置tornado靜態(tài)文件夾目錄 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 ) # 將數(shù)據(jù)庫連接注入到事件循環(huán)中 app.objects = peewee_async.Manager(database) app.redis = redis.Redis(password='123',decode_responses=True) # 將異步redis鏈接注入到事件循環(huán) # 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("開啟服務(wù)") tornado.options.parse_command_line() app.listen(options.port) tornado.ioloop.IOLoop.instance().start()
到此這篇關(guān)于Python web框架之tornado的使用的文章就介紹到這了,更多相關(guān)Python tornado內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用docx模塊讀寫docx文件的方法與docx模塊常用方法詳解
這篇文章主要介紹了python使用docx模塊讀寫docx文件的方法與docx模塊常用方法詳解,需要的朋友可以參考下2020-02-02解決python3.x安裝numpy成功但import出錯(cuò)的問題
這篇文章主要介紹了解決python3.x安裝numpy成功但import出錯(cuò)的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11詳解多線程Django程序耗盡數(shù)據(jù)庫連接的問題
這篇文章主要介紹了多線程Django程序耗盡數(shù)據(jù)庫連接的問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10python操作excel之openpyxl模塊讀寫xlsx格式使用方法詳解
這篇文章主要介紹了python操作excel之openpyxl模塊讀寫xlsx格式使用方法詳解,需要的朋友可以參考下2022-12-12python Aligo庫設(shè)置json路徑使用詳解
這篇文章主要為大家介紹了python Aligo庫設(shè)置json路徑使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11python二進(jìn)制轉(zhuǎn)換模塊的具體用法
在pyton中,通過struct模塊來對(duì)二進(jìn)制進(jìn)行轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01