現(xiàn)代開(kāi)發(fā)者必備:5個(gè)更流暢、更受歡迎的Python web框架
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。
如今,可供選擇的Python web框架有不少,能幫助你更快更輕松地創(chuàng)建web應(yīng)用。本文就將為大家介紹一些更現(xiàn)代、使用更廣泛的web框架。
1. FastAPI
FastAPI致力于實(shí)現(xiàn)輕便和快速,筆者很喜歡它,它的開(kāi)發(fā)速度和簡(jiǎn)單程度令人欣慰。這對(duì)于端點(diǎn)特別有用,因?yàn)樗鼈兂诉壿嬛馔ǔ](méi)有太多內(nèi)容,而且很可能不需要Django或TurboGears等工具提供的所有無(wú)用信息來(lái)創(chuàng)建。
FastAPI也有非常好的文檔,這讓它變得易于學(xué)習(xí)。FastAPI中的“快”代表了開(kāi)發(fā)api所需要的速度和這些api返回的速度。與其他web框架類(lèi)似,它還基于API創(chuàng)建的開(kāi)放標(biāo)準(zhǔn),你可以在一個(gè)方便的包中獲得傳輸數(shù)據(jù)所需的所有工具。
在語(yǔ)法方面,F(xiàn)astAPI采用一種非常類(lèi)似于flass的方法來(lái)創(chuàng)建端點(diǎn)。
- from fastapi import FastAPI
- app = FastAPI()
- @app.get("/")
- async def root():
- return {"message":"Hello World"}
2. Tornado
Tornado不僅是一個(gè)優(yōu)秀的web框架,而且還是一個(gè)異步網(wǎng)絡(luò)庫(kù),這讓Tornado就能夠?yàn)閿?shù)以千計(jì)的開(kāi)放連接服務(wù)。Tornado使用非阻塞網(wǎng)絡(luò)進(jìn)出流,使得它對(duì)于需要龐大且可伸縮的解決方案非常有用。
實(shí)際上,Tornado與大多數(shù)其他Python web框架有很大不同,它不在WSGI上運(yùn)行。雖然這意味著在web服務(wù)器的選擇上可能受到一些限制,但Tornado提供了預(yù)打包服務(wù)器,可以立即啟動(dòng)并運(yùn)行。
雖然筆者很喜歡Tornado,但需要注意的是,當(dāng)筆者嘗試用NGINX部署它時(shí)確實(shí)遇到了很多bug。而且在某些情況下,讓NGINX路由到正確的位置是并不是一件開(kāi)心的事兒。筆者也遇到過(guò)Genie for Julia,不確定是什么原因造成的,但如果使用Tornado,那么最好設(shè)置一個(gè)Apache服務(wù)器,而不是NGINX服務(wù)器。
在語(yǔ)法方面,Tornado采用的是非常類(lèi)似TurboGears的路由方法。使用Tornado時(shí),通常會(huì)構(gòu)建類(lèi)來(lái)處理這些路由上的響應(yīng),而不是將邏輯放在路由中,來(lái)看看這個(gè)例子:
- import tornado.ioloop
- import tornado.web
- class MainHandler(tornado.web.RequestHandler):
- def get(self):
- self.write("Hello,world")
- def make_app():
- returntornado.web.Application([
- (r"/", MainHandler),
- ])
- if __name__ == "__main__":
- app = make_app()
- app.listen(8888)
- tornado.ioloop.IOLoop.current().start()
3. Quart
不要被Quart的標(biāo)志搞暈了,它與Flash模塊關(guān)系更緊密,而不是Bottle模塊。Quart本質(zhì)上是把兩個(gè)web框架放入一個(gè)模塊的組合:Asyncio和Flask。
這是一件了不起的事情,這兩者的結(jié)合稱(chēng)得上完美!與Flask一樣,Quart是輕量級(jí)的,但是也包含了一個(gè)完整的異步特性列表。
筆者也很喜歡Quart,它感覺(jué)就像一個(gè)稍微加強(qiáng)了的Flask,在添加更多功能的過(guò)程中不會(huì)降低速度或易用性。有趣的是,Quart文檔實(shí)際上建議你訪(fǎng)問(wèn)Flask文檔,筆者認(rèn)為這正說(shuō)明了它的分叉特性。如果你想要一個(gè)異步Flask,Quart是很好的選擇。
- from quart import Quart
- app = Quart(__name__)
- @app.route('/')
- async def hello():
- return 'hello'
- app.run()
4. BlackSheep
“BlackSheep”受到了ASP.NET和Flask等優(yōu)秀工具的啟發(fā),可用于輕松創(chuàng)建基于事件的web應(yīng)用程序。筆者真的不明白為什么它被稱(chēng)為“BlackSheep”,這一框架背后的語(yǔ)法和方法與Flask幾乎相同。
- from datetime import datetime
- from blacksheep.server import Application
- from blacksheep.server.responses import text
- app = Application()
- @app.route('/')
- async def home(request):
- return text(f'Hello, World!{datetime.utcnow().isoformat()}')
與Quart一樣,Black Sheep也提供了非常棒的工具,用于在web上同步和創(chuàng)建非阻塞端點(diǎn)。整體上來(lái)講,它是一個(gè)非常好用的框架,但與Quart非常相似。所以如果用了一個(gè),你肯定也同時(shí)會(huì)使用這兩個(gè)框架。
5. Pyramid
Pyramid是筆者很喜歡使用的網(wǎng)絡(luò)框架之一。雖然Pyramid堅(jiān)持輕量級(jí)的想法,并提供非常簡(jiǎn)單的方法,以最小的代碼快速建立端點(diǎn),但它同時(shí)也包括所有你可能需要的功能。
Pyramid受贊譽(yù)最多的一點(diǎn)是它的可擴(kuò)展性。Pyramid可以是基礎(chǔ)的,也可以是復(fù)雜的,數(shù)據(jù)科學(xué)家會(huì)很喜歡它,他們可能想在未來(lái)擴(kuò)展他們的端點(diǎn)。在句法上,Pyramid和Tornado大致相同。它始終遵循面向?qū)ο蟮姆妒健?/p>
- from wsgiref.simple_server importmake_server
- from pyramid.config import Configurator
- from pyramid.response import Response
- def hello_world(request):
- return Response('HelloWorld!')
- if __name__ == '__main__':
- with Configurator() asconfig:
- config.add_route('hello', '/')
- config.add_view(hello_world,route_name='hello')
- app = config.make_wsgi_app()
- server = make_server('0.0.0.0',6543, app)
- server.serve_forever()
如今,有一些更現(xiàn)代、使用更廣泛的web框架,能幫助你部署新的端點(diǎn)。它們各有亮點(diǎn),但如果必須選擇的話(huà),筆者可能會(huì)選擇FastAPI。FastAPI簡(jiǎn)單、輕量級(jí),一個(gè)字就是快。
當(dāng)然,這并不是說(shuō)FastAPI在每種情況下都是最好的選擇。最好根據(jù)具體情況來(lái)決定需要的最佳特性是什么然后再選擇,而不是根據(jù)主觀意見(jiàn)。
如果有足夠的存儲(chǔ)空間,所有這些框架都是值得一試。如果想讓體驗(yàn)更上一層樓,下一步就是對(duì)請(qǐng)求響應(yīng)進(jìn)行一些速度測(cè)試,看看誰(shuí)是最佳。