做Web開(kāi)發(fā),選對(duì)框架很重要。剛?cè)腴T的時(shí)候,很多人會(huì)糾結(jié)用Tornado還是Flask。這兩個(gè)都是Python寫的,都能搭網(wǎng)站,但走的路子不一樣。
Flask:輕巧靈活,適合快速上手
Flask就像一把小刀,功能不多,但夠用、順手。你要是想做個(gè)簡(jiǎn)單的博客、后臺(tái)接口或者練手項(xiàng)目,F(xiàn)lask非常合適。它不強(qiáng)制你用什么結(jié)構(gòu),你可以按自己的節(jié)奏來(lái)加功能。
比如你要寫個(gè)返回“Hello World”的頁(yè)面,代碼就幾行:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello World'
if __name__ == '__main__':
app.run()
啟動(dòng)后訪問(wèn) http://127.0.0.1:5000 就能看到內(nèi)容。整個(gè)過(guò)程簡(jiǎn)單直接,沒(méi)有多余步驟。
Tornado:專為高并發(fā)設(shè)計(jì)
如果你做的應(yīng)用要同時(shí)處理成千上萬(wàn)個(gè)連接,比如聊天室、實(shí)時(shí)通知系統(tǒng),那Tornado就更合適。它從底層就是異步非阻塞的,能扛住大量用戶同時(shí)在線。
同樣是“Hello World”,Tornado是這么寫的:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('Hello World')
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
看著比Flask復(fù)雜一點(diǎn),但它支持長(zhǎng)連接、WebSocket這些實(shí)時(shí)通信功能,F(xiàn)lask默認(rèn)做不到。
性能表現(xiàn)不一樣
Flask用的是同步模型,一個(gè)請(qǐng)求沒(méi)處理完,下一個(gè)就得等。平時(shí)訪問(wèn)量不大的網(wǎng)站沒(méi)問(wèn)題,但要是突然來(lái)了一堆人,服務(wù)器可能就卡住了。
Tornado天生異步,靠事件循環(huán)處理請(qǐng)求。哪怕同時(shí)來(lái)幾千個(gè)連接,也能穩(wěn)住。就像餐廳里一個(gè)服務(wù)員能輪流照看多桌客人,不用死等一桌點(diǎn)完菜。
生態(tài)和擴(kuò)展性對(duì)比
Flask社區(qū)大,插件多。要加數(shù)據(jù)庫(kù)、用戶登錄、表單驗(yàn)證,搜一下就有現(xiàn)成的擴(kuò)展,比如Flask-SQLAlchemy、Flask-Login,拿來(lái)就能用。
Tornado的生態(tài)相對(duì)小一些,很多功能得自己實(shí)現(xiàn)或找第三方庫(kù)。不過(guò)它自帶異步HTTP客戶端和服務(wù)端,做爬蟲(chóng)或代理服務(wù)反而更方便。
什么時(shí)候該選哪個(gè)?
你想做個(gè)企業(yè)官網(wǎng)、個(gè)人博客、REST API,追求開(kāi)發(fā)快、結(jié)構(gòu)清晰,F(xiàn)lask是首選。大多數(shù)中小型項(xiàng)目,它都吃得下。
但如果你要做實(shí)時(shí)應(yīng)用,比如在線聊天、股票行情推送、游戲服務(wù)器,那直接上Tornado更省心。別等到用戶多了再改架構(gòu),那時(shí)候坑更多。
說(shuō)白了,F(xiàn)lask適合“先跑起來(lái)”,Tornado適合“一直撐得住”。根據(jù)你的實(shí)際需求選,別盲目追熱門。