【FastAPI】入門基礎

Tony_xiao發表於2024-10-16
  • FastAPI 介紹和安裝

    • FastAPI 是一個基於 Python 3.6+ 版本的非同步 WEB 應用框架,使用 Python 型別註解構建 web API 。它的主要特點如下:
      • 高效能:與 Node JS 和 Go 相當。
      • 編碼快:將開發功能的速度提高 2~3 倍。
      • Bug少:減少大約 40% 的由開發人員導致的錯誤。
      • 直觀:強大的編輯器支援,可智慧感知和補全程式碼。
      • 簡單:易於學習和使用,減少文件閱讀時間。
      • 簡短:儘量減少程式碼重複。
      • 健壯:獲得可用於生產的程式碼,具有自動互動文件。
      • 基於標準:基於 OpenAPI 和 JSON Schema 。
  • 1.安裝

    • pip install fastapi
    • pip install "uvicorn[standard]"
  • 2.請求方式

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/index")
def index():
    return {"name": "index222"}


@app.post("/home")
def home():
    return {"name": "home"}


@app.api_route("/info", methods=["GET", "POST"])
def info():
    return {"name": "info"}


if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=9001)
    # uvicorn.run("v1.app", host="127.0.0.1", port=9001,reload=True)  # 修改程式碼後,自動重啟
  • 3.請求引數
import uvicorn
from fastapi import FastAPI
from fastapi.requests import Request

app = FastAPI()

#http://127.0.0.1:9001/home/12
@app.get("/home/{uid}")
def home(uid):
    print(uid)
    return {"data": "ok"}

#http://127.0.0.1:9001/index?info=123&age=18
@app.get("/index")
def index(info: str, age: int):
    print(info, age)
    return {"data": "ok"}

#
# @app.get("/mine/{uid}")
# def mine(uid: int, info: str, age: int):
#     print(uid)
#     print(info, age)
#     return {"data": "ok"}

# http://127.0.0.1:9001/mine/12?info=123&age=18
@app.get("/mine/{uid}")
def mine(request: Request, uid: int):
    print(uid)
    print(request.query_params)   # info=123&age=18
    print(request.query_params.get("info"))
    return {"data": "ok"}


if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=9001)
  • 4.請求體
import uvicorn
from fastapi import FastAPI
from fastapi.requests import Request
from pydantic import BaseModel
from typing import List, Dict

app = FastAPI()

class Data(BaseModel):
    name: str
    age: int
    hobby: List
    info: Dict


@app.post("/home")
def home(data: Data):
    print(data.name)
    print(data.hobby)
    print(data.info)
    return {"data": "ok"}


@app.post("/mine")
async def mine(request: Request):
    data_dict = await request.json()
    print(data_dict)
    # {'name': 'xwl', 'age': 19, 'hobby': ['籃球', '足球'], 'info': {'k1': 123, 'k2': 456, 'k3': [111, 222, 33]}}
    return {"data": "ok"}


if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=9001)
  • 5.請求中介軟體,攔截所有的請求
import uvicorn
from fastapi import FastAPI
from fastapi import Request
from fastapi.responses import JSONResponse

app = FastAPI()

@app.middleware("http")
async def auth(request: Request, call_next):
    print("before")
    res = await call_next(request)
    print("after")
    return res

@app.get("/home")
def home(age):
    print(age)
    return {"data": "ok"}

if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=9001)