Python Web:Django、Flask和FastAPI框架對比

2023-08-24 18:00:23

Django、Flask和FastAPI是Python Web框架中的三個主要代表。這些框架都有著各自的優點和缺點,適合不同型別和規模的應用程式。

  1. Django:
    Django是一個全功能的Web框架,它提供了很多內建的應用程式和工具,使得開發Web應用程式更加容易。Django採用了MTV(模型-模板-檢視)設計模式,提供ORM等強大的功能,因此適合構建大型、複雜的Web應用程式,如社群網路或電子商務網站。Django的主要優點在於快速開發、自帶管理後臺、豐富的檔案以及廣泛的社群支援。但是,Django也很龐大,可能導致效能較低,並且學習曲線較陡峭。

  2. Flask:
    Flask是一個輕量級的Web框架,它沒有像Django那樣的內建應用程式和工具,因此適合用於小型Web應用程式和原型的快速開發。Flask框架非常靈活,易於擴充套件,而且學習曲線相對Django來說更加平滑。由於其輕量級特性,Flask可以很好地與其他Python庫整合,如SQLAlchemy等。但是,相對於Django,Flask缺少某些功能,如ORM等。

  3. FastAPI:https://fastapi.tiangolo.com/zh
    FastAPI是一個較新的Web框架,它採用了非同步程式設計模型和型別提示,效能非常出色。FastAPI支援OpenAPI(以前稱為Swagger)規範,並提供自動生成API檔案的功能。FastAPI易於使用、快速開發、高效能的特性使其成為開發高吞吐量API的首選框架。但是,由於其年輕的生態系統,FastAPI缺少一些Django和Flask所擁有的庫和工具。

在使用場景方面,Django適用於需要處理大量資料或實現複雜業務邏輯的應用程式,而Flask適用於小型應用程式或快速原型開發。FastAPI則適用於開發高吞吐量API和微服務。

市場份額方面,據調查顯示,2021年Django在全球Python Web框架中市場佔有率最高,其次是Flask。FastAPI作為新興框架,市場佔有率尚不明確。

未來趨勢方面,三者都有其優點和優秀的社群支援,在不同領域的應用中仍然有著廣泛的前景。但是,隨著Python生態系統的不斷壯大,可能會湧現更多的Web框架,這將影響三者的市場份額。

以下是使用Django、Flask和FastAPI實現Hello World的程式碼:

安裝依賴

requirements.txt

# async web framework
uvicorn==0.23.2
fastapi==0.101.1

# sync web framework
Flask==2.3.2

pip install -r requirements-sync.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

建立一個HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
Hello VipSoft
</body>
</html>

Flask Demo

flask_demo.py

#!/usr/bin/env python
import logging
import os

from flask import Flask

# 指定靜態頁面的地址
app = Flask(__name__, static_url_path="/static/")

port = int(os.getenv("PORT", 8080))

# 啟動後的首頁,
@app.route("/")
def get_index():
    return app.send_static_file("index.html")


# 使用@app.route裝飾器定義了一個路由。在這個路由中,當瀏覽器請求/hello路徑時,會執行名稱為hello的函數並
@app.route('/hello')
def hello():
    return 'Hello, Flask!'


# 啟用時,指定埠 8080,其它預設
if __name__ == "__main__":
    logging.root.setLevel(logging.INFO)
    logging.info("Starting on port %d ", port)

    app.run(port=port)


檢視效果

FastAPI Demo

fastapi_demo.py

#!/usr/bin/env python
import logging
import os
 
from fastapi import FastAPI
from fastapi.responses import FileResponse

# 指定靜態頁面的地址
app = FastAPI()

port = int(os.getenv("PORT", 8080))

PATH = os.path.dirname(os.path.abspath(__file__))


@app.get("/")
async def get_index():
    return FileResponse(os.path.join(PATH, "static", "index.html"))


@app.get("/hello")
async def hello():
    return {"message": "Hello, FastAPI!"}


if __name__ == "__main__":
    import uvicorn

    logging.root.setLevel(logging.INFO)
    logging.info("Starting on port %d ", port)

    uvicorn.run(app, port=port)

檢視效果