天天看點

python web架構大盤點

作者:王觀影

大家說起python,首先想到的就是慢,再就是性能差,最後是一把大鎖(全局解釋器鎖)限制了速度,導緻又慢性能又差!

首先看看python慢的原因:

  • Python 是解釋型語言而不是編譯型語言;
  • 是因為 Python 是一種動态類型的語言,邊解釋邊執行;
  • 全局解釋器鎖(Global Interpreter Lock)(GIL)的原因,導緻不能使用多核CPU并發執行;

但是python的優點更多,下邊來說說python的亮點:

  • python易于程式設計,文法簡單
  • python開源,每個人都可以建構修改
  • Python 是進階語言

這裡所說的進階,是指 Python 封裝較深,屏蔽了很多底層細節,比如 Python 會自動管理記憶體(需要時自動配置設定,不需要時自動釋放)。

  • Python 是解釋型語言

解釋型語言一般都是跨平台的(可移植性好)

  • Python 是面向對象的程式設計語言

面向對象(Object Oriented)是大多數“現代”語言(即第三代程式設計語言)都具備的特性,否則在開發中大型程式時會捉襟見肘。

Python 雖然支援面向對象,但它并不強制你使用這種特性。Java 是典型的面向對象的程式設計語言,它強制必須以類和對象的形式來組織代碼。

  • Python 功能強大(子產品衆多)

Python 的子產品衆多,基本實作了所有的常見的功能,從簡單的字元串處理,到複雜的 3D 圖形繪制,借助 Python 子產品都可以輕松完成。

Python 社群發展良好,除了 Python 官方提供的核心子產品,很多第三方機構也會參與到子產品的開發中,這其中就有 Google(谷歌)、Facebook(臉書)、Microsoft(微軟) 等軟體巨頭。

  • Python 可擴充性強

Python 的可擴充性展現在它的子產品,Python 具有腳本語言中最豐富、強大的庫或子產品,這些庫或子產品覆寫了檔案操作、圖形界面程式設計、網絡程式設計、資料庫通路等絕大部分應用場景。

值得注意的是,這些類庫的底層代碼不一定都是 Python,還有很多 C/C++ 的身影。

比如當需要一段關鍵代碼運作速度更快時,就可以使用 C/C++ 語言實作,然後在 Python 中調用它們。Python 能把其它語言“粘”在一起,是以被稱為“膠水語言”。

Python 依靠其良好的擴充性,在一定程度上彌補了運作效率慢的缺點。

  • 用途廣泛

Python是一個萬能的程式設計語言,無所不能,可謂法力無邊!

Web開發、網絡爬蟲、人工智能、資料分析、自動化運維、系統程式設計、圖形處理、數學處理、文本處理、資料庫程式設計、網絡程式設計、多媒體應用、遊戲開發

  • 最受開發者歡迎,有圖為證

以下是TIOBE的統計結果:

python web架構大盤點
python web架構大盤點

今天來盤點一下python有哪些web架構,以及常用的和性能最棒的有哪些;

python的web架構有很多,比較流行的架構有:Django,Flask,Tornado,Sanic, Bottle, web.py, CherryPy, twisted, Wheezy Web, web2py, AIOHTTP, Falcon, Bottle, FastAPI等等。

如此多的web架構,怎麼才能選擇到合适的呢?

首選想必是Django或flask吧, 再或者是Tornado這三大架構吧!

首先說Django這個老大哥:

Django是一個開放源代碼的Web應用架構,由Python寫成。采用了MTV的架構模式,即模型M,模闆T和視圖V。它最初是被開發來用于管理勞倫斯出版集團旗下的一些以新聞内容為主的網站的,即是CMS(内容管理系統)軟體。

特點:大而全,自帶的功能特别特别特别的多,類似于航空母艦;

不足之處:有時候過于笨重

其次說flask這個暫且為二哥的架構:

Flask是一個使用 Python編寫的輕量級Web應用架構。其 WSGI工具箱采用 Werkzeug ,模闆引擎則使用 Jinja2 。Flask使用 BSD 授權。

Flask也被稱為 “microframework” ,因為它使用簡單的核心,用 extension 增加其他功能。Flask沒有預設使用的資料庫、窗體驗證工具。

Flask 很輕,花很少的成本就能夠開發一個簡單的網站。非常适合初學者學習。Flask 架構學會以後,可以考慮學習插件的使用。例如使用 WTForm Flask-WTForm 來驗證表單資料,用 SQLAlchemy Flask-SQLAlchemy 來對你的資料庫進行控制。

如此多的介紹,一句話概況特點:短小精悍!

不足之處:比較依賴于第三方的開發者。

接下來再說說三哥Tornado:

Tornado是一種 Web 伺服器軟體的開源版本。Tornado 和現在的主流 Web 伺服器架構(包括大多數 Python 的架構)有着明顯的差別:它是非阻塞式伺服器,而且速度相當快。

得利于其非阻塞的方式和對epoll的運用,Tornado每秒可以處理數以千計的連接配接,是以Tornado 是實時 Web 服務的一個 理想架構。

特點:異步非阻塞,支援高并發,牛逼到甚至可以開發遊戲伺服器!

不足之處:模闆和資料庫部分有很多第三方的子產品可供選擇,這樣不利于封裝為一個功能子產品,這句話是在網上找的,暫且不做評論。

web架構top3介紹完了,再重點說下後起之秀FastAPI。FastAPI 是一個現代、快速(高性能)的 Web 架構,用于基于标準 Python 類型提示使用 Python 3.6+ 建構 API。非常高的性能,與 NodeJS 和 Go 相當(感謝 Starlette 和 Pydantic)。可用的最快的 Python 架構之一。減少大約 40% 的人為(開發人員)引發的錯誤。簡短,簡單,直覺,健壯。

再看看各大web架構的性能比拼:

fastapi排在第三位,排在第一位的是Starlette;而fastapi的架構正是在Starlette的基礎上開發而來,站在巨人的肩膀上,當然登高望遠!

當然不足之處也挺明顯,fastapi比較年輕,社群較小,第三方的教程相對較少。

python web架構大盤點

介紹一下FastAPI的特性:

關鍵特性:

  • 快速:可與 NodeJS 和 Go 并肩的極高性能(歸功于 Starlette 和 Pydantic)。最快的 Python web 架構之一。
  • 高效編碼:提高功能開發速度約 200% 至 300%。*
  • 更少 bug:減少約 40% 的人為(開發者)導緻錯誤。*
  • 智能:極佳的編輯器支援。處處皆可

自動補全,減少調試時間。

  • 簡單:設計的易于使用和學習,閱讀文檔的時間更短。
  • 簡短:使代碼重複最小化。通過不同的參數聲明實作豐富功能。bug 更少。
  • 健壯:生産可用級别的代碼。還有自動生成的互動式文檔。
  • 标準化:基于(并完全相容)API 的相關開放标準:OpenAPI (以前被稱為 Swagger) 和 JSON Schema。

建立一個簡單的fastapi項目看看:

from fastapi import FastAPI, Request, Response, HTTPException
from sql_app import models
from sql_app.db import engine, SessionLocal
from app.demo1 import demo1
from app.demo2 import router

def create_app():
    app = FastAPI(title="fast_demo", description="fast api demo", version="1.0.0")

    @app.middleware("http")
    async def db_session_middleware(request: Request, call_next):
        response = Response("Internal server error", status_code=500)
        try:
            request.state.db = SessionLocal()
            response = await call_next(request)
        finally:
            request.state.db.close()
        return response

    # 挂載子路由
    app.include_router(prefix="/api", router=demo1)
    app.include_router(router=router, prefix="/api/v1")
    return app


# uvicorn main:app --reload 啟動
app = create_app()

# Dependency
def get_db(request: Request):
    return request.state.db

if __name__ == '__main__':
    import uvicorn
    uvicorn.run("main:app", host="0.0.0.0",  port=8000, reload=True)           

demo1.py

demo1 = APIRouter(tags=["demo1"])

@demo1.get("/")
async def index():
    # return "hello fastapi"
    return {"msg": "hello fastapi"}


@demo1.get("/items/me")
async def read_item_me():
    return {"item": "me"}


@demo1.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = Query(None, max_length=5), short: bool = False):
    """查詢參數和字元串校驗"""
    item = {"item_id": item_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update({"desc": "This is an amazing item that has a long description"})
    return item           

啟動項目

uvicorn main:app --reload

通過互動式 API 文檔檢視接口:

python web架構大盤點
python web架構大盤點
  • 執行接口
python web架構大盤點