首頁 > 後端開發 > Python教學 > 透過 FastAPI 中的非同步程式設計增強您的 API 效能

透過 FastAPI 中的非同步程式設計增強您的 API 效能

Barbara Streisand
發布: 2024-12-24 15:22:15
原創
243 人瀏覽過

準備好將您的 API 遊戲提升到新的水平了嗎?

FastAPI 設計讓您的 API 更快、更能回應靈敏,並且能夠像專業人士一樣處理重負載。

在本文中,我們將向您展示如何利用 FastAPI 中的非同步程式設計來建立高效能 API。最後,您將具備實現非同步端點並有效測試它們的知識。

你將學到什麼

這是您將要掌握的內容:

  • 非同步程式設計的基礎知識及其重要性。
  • 如何建置FastAPI環境進行非同步開發。
  • 使用真實範例編寫和測試非同步端點。
  • 使用非同步程式庫進行 HTTP 請求、檔案處理和後台任務。

為什麼在 FastAPI 中使用非同步程式設計?

它是什麼?

非同步程式設計使任務能夠並發運作。這對於網路請求、資料庫查詢或文件操作等通常需要等待回應的任務特別有用。

為什麼它很重要?

在傳統的同步程式設計中,任務會依序運行,導致處理多個請求時出現延遲。透過非同步編程,您可以同時為多個使用者提供服務,最大限度地提高資源利用率並確保更好的使用者體驗。

設定您的 FastAPI 環境

現在,讓我們捲起袖子,創造一些令人驚嘆的東西!

首先,安裝所需的庫:

pip install "fastapi[standard]" httpx aiofiles pytest
登入後複製
登入後複製

守則

以下是一個完整的範例,示範了 FastAPI 中的非同步程式設計。程式碼的每個部分都有獨特的用途,我們將逐步解釋它們。

from fastapi import FastAPI, BackgroundTasks
import httpx
import aiofiles
import pytest
from fastapi.testclient import TestClient

app = FastAPI()

# API Endpoints
@app.get("/item/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

@app.get("/external-api")
async def call_external_api():
    async with httpx.AsyncClient() as client:
        response = await client.get("https://jsonplaceholder.typicode.com/posts/1")
    return response.json()

@app.get("/read-file")
async def read_file():
    async with aiofiles.open("example.txt", mode="r") as file:
        content = await file.read()
    return {"content": content}

def send_email(email: str, message: str):
    print(f"Sending email to {email} with message: {message}")

@app.post("/send-email/")
async def schedule_email(background_tasks: BackgroundTasks, email: str):
    background_tasks.add_task(send_email, email, "Welcome!")
    return {"message": "Email scheduled"}

# Testing Code
client = TestClient(app)

def test_read_item():
    response = client.get("/item/1")
    assert response.status_code == 200
    assert response.json() == {"item_id": 1}

def test_read_file():
    # Create an example file for testing
    with open("example.txt", "w") as file:
        file.write("This is a test file content")

    response = client.get("/read-file")
    assert response.status_code == 200
    assert response.json() == {"content": "This is a test file content"}

def test_schedule_email():
    response = client.post("/send-email/?email=fogigav197@rabitex.com")
    assert response.status_code == 200
    assert response.json() == {"message": "Email scheduled"}

@pytest.mark.asyncio
async def test_call_external_api():
    async with httpx.AsyncClient() as async_client:
        response = await async_client.get("https://jsonplaceholder.typicode.com/posts/1")
    assert response.status_code == 200
    assert "id" in response.json()
登入後複製
登入後複製

分解它

API端點

1.簡單非同步端點

@app.get("/item/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}
登入後複製
登入後複製

此端點顯示如何使用 async def 定義基本非同步路由。它透過 ID 檢索項目。

2.呼叫外部API

@app.get("/external-api")
async def call_external_api():
    async with httpx.AsyncClient() as client:
        response = await client.get("https://jsonplaceholder.typicode.com/posts/1")
    return response.json()
登入後複製

這示範如何使用 httpx 發出非阻塞 HTTP 請求。在等待外部 API 回應時,您的應用程式可以處理其他請求。

3.非同步檔案讀取

@app.get("/read-file")
async def read_file():
    async with aiofiles.open("example.txt", mode="r") as file:
        content = await file.read()
    return {"content": content}
登入後複製

這會非同步讀取文件,確保文件操作不會阻塞應用程式。

4.後台任務執行

def send_email(email: str, message: str):
    print(f"Sending email to {email} with message: {message}")

@app.post("/send-email/")
async def schedule_email(background_tasks: BackgroundTasks, email: str):
    background_tasks.add_task(send_email, email, "Welcome!")
    return {"message": "Email scheduled"}
登入後複製

此端點安排後台任務發送電子郵件,允許主執行緒處理其他請求。

測試程式碼

1.測試基本端點

def test_read_item():
    response = client.get("/item/1")
    assert response.status_code == 200
    assert response.json() == {"item_id": 1}
登入後複製

這將驗證 /item/{item_id} 端點傳回預期的資料。

2.測試檔讀取

pip install "fastapi[standard]" httpx aiofiles pytest
登入後複製
登入後複製

這將建立一個測試檔案並檢查 /read-file 端點是否已正確讀取並傳回其內容。

3.測試後台任務

from fastapi import FastAPI, BackgroundTasks
import httpx
import aiofiles
import pytest
from fastapi.testclient import TestClient

app = FastAPI()

# API Endpoints
@app.get("/item/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

@app.get("/external-api")
async def call_external_api():
    async with httpx.AsyncClient() as client:
        response = await client.get("https://jsonplaceholder.typicode.com/posts/1")
    return response.json()

@app.get("/read-file")
async def read_file():
    async with aiofiles.open("example.txt", mode="r") as file:
        content = await file.read()
    return {"content": content}

def send_email(email: str, message: str):
    print(f"Sending email to {email} with message: {message}")

@app.post("/send-email/")
async def schedule_email(background_tasks: BackgroundTasks, email: str):
    background_tasks.add_task(send_email, email, "Welcome!")
    return {"message": "Email scheduled"}

# Testing Code
client = TestClient(app)

def test_read_item():
    response = client.get("/item/1")
    assert response.status_code == 200
    assert response.json() == {"item_id": 1}

def test_read_file():
    # Create an example file for testing
    with open("example.txt", "w") as file:
        file.write("This is a test file content")

    response = client.get("/read-file")
    assert response.status_code == 200
    assert response.json() == {"content": "This is a test file content"}

def test_schedule_email():
    response = client.post("/send-email/?email=fogigav197@rabitex.com")
    assert response.status_code == 200
    assert response.json() == {"message": "Email scheduled"}

@pytest.mark.asyncio
async def test_call_external_api():
    async with httpx.AsyncClient() as async_client:
        response = await async_client.get("https://jsonplaceholder.typicode.com/posts/1")
    assert response.status_code == 200
    assert "id" in response.json()
登入後複製
登入後複製

這測試後台電子郵件任務是否成功排程。

4.測試外部 API 呼叫

@app.get("/item/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}
登入後複製
登入後複製

這可確保 /external-api 端點正確地從外部來源取得資料。

輸出

Supercharge Your API Performance with Asynchronous Programming in FastAPI

結論

透過提供的程式碼,您現在可以實際了解如何使用 FastAPI 建立和測試非同步 API。無論是處理檔案、呼叫外部 API 還是調度後台任務,非同步程式設計都可以讓您建立可輕鬆擴展的高效能應用程式。

準備好建立您的下一個 FastAPI 專案了嗎?讓我們開始吧!

感謝您的閱讀...
編碼快樂!

以上是透過 FastAPI 中的非同步程式設計增強您的 API 效能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板