Membuat Permintaan HTTP Hilir dalam FastAPI/Uvicorn Menggunakan httpx
Pengenalan
Semasa menggunakan Titik akhir API dalam FastAPI/Uvicorn yang bergantung pada permintaan HTTP luaran, adalah penting untuk memastikan pengendalian concurrency selamat benang. Artikel ini meneroka pendekatan yang disyorkan untuk menangani isu ini menggunakan perpustakaan httpx.
Menggunakan httpx
Inместоrequests, httpx menawarkan API tak segerak yang menyokong berbilang permintaan HTTP serentak menggunakan klien kongsi. Ini meningkatkan prestasi dengan menggunakan semula sambungan dan pengepala.
Melaksanakan httpx dalam FastAPI
Untuk menggunakan httpx dalam FastAPI, anda boleh menggunakan AsyncClientnya:
from fastapi import FastAPI from httpx import AsyncClient app = FastAPI() app.state.client = AsyncClient() @app.on_event("shutdown") async def shutdown_event(): await app.state.client.aclose()
Dalam contoh ini, pelanggan kongsi dicipta sebagai sebahagian daripada keadaan FastAPI, membolehkan ia diakses oleh titik akhir.
Contoh Async
Titik akhir berikut membuat permintaan HTTP tak segerak dan menstrimkan respons kembali kepada klien:
from fastapi import FastAPI, StreamingResponse, BackgroundTask @app.get("/") async def home(): client = app.state.client req = client.build_request("GET", "https://www.example.com/") r = await client.send(req, stream=True) return StreamingResponse(r.aiter_raw(), background=BackgroundTask(r.aclose))
Contoh yang dikemas kini
Dengan penamatan acara permulaan dan penutupan, anda kini boleh menggunakan pengendali jangka hayat:
from fastapi import FastAPI, Request, lifespan from starlette.background import BackgroundTask from httpx import AsyncClient, Request @lifespan.on_event("startup") async def startup_handler(app: FastAPI): app.state.client = AsyncClient() @lifespan.on_event("shutdown") async def shutdown_handler(): await app.state.client.aclose() @app.get("/") async def home(request: Request): client = request.state.client req = client.build_request("GET", "https://www.example.com") r = await client.send(req, stream=True) return StreamingResponse(r.aiter_raw(), background=BackgroundTask(r.aclose))
Membaca Kandungan Respons
Jika anda perlu membaca kandungan respons di bahagian pelayan sebelum menghantarnya kepada pelanggan, anda boleh menggunakan a penjana:
def gen(): async for chunk in r.aiter_raw(): yield chunk await r.aclose() return StreamingResponse(gen())
Kesimpulan
Dengan memanfaatkan httpx dan klien async kongsinya, anda boleh mengendalikan permintaan HTTP hiliran dengan cekap dalam FastAPI/Uvicorn, memastikan keselamatan dan prestasi thread pengoptimuman dalam persekitaran berbilang benang.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Permintaan HTTP Hilir dengan Cekap dalam FastAPI/Uvicorn Menggunakan httpx?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!