ホームページ >バックエンド開発 >Python チュートリアル >httpx はどのようにして FastAPI でのダウンストリーム HTTP リクエストを安全かつ効率的に強化できますか?

httpx はどのようにして FastAPI でのダウンストリーム HTTP リクエストを安全かつ効率的に強化できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-07 17:27:15950ブラウズ

How Can httpx Enhance Safe and Efficient Downstream HTTP Requests in FastAPI?

httpx を使用して FastAPI でダウンストリーム HTTP リクエストを安全に作成する

標準の Python リクエスト ライブラリを使用して FastAPI で HTTP リクエストを作成する場合、同時リクエストの中でスレッドの安全性が問題になります。この問題に効果的に対処するには、スレッド セーフとパフォーマンスの向上の両方を提供するライブラリである httpx の採用を検討してください。

httpx 非同期 API の使用

httpx には非同期 API が付属しているため、簡単に複数の同時タスクを効率的に処理しながら、HTTP リクエストを実行します。 FastAPI エンドポイント内での使用例を次に示します:

from httpx import AsyncClient
from fastapi import FastAPI, Request

app = FastAPI()

@app.on_event("startup")
async def startup_event():
    app.state.client = AsyncClient()

@app.on_event('shutdown')
async def shutdown_event():
    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))

この例では:

  • startup_event() は共有 httpx AsyncClient を初期化し、アプリの状態に保存します。
  • shutdown_event() はアプリケーション時にクライアントを正常に閉じますshutdown.
  • home() は、共有クライアントを使用して https://www.example.com への HTTP リクエストを実行し、ストリーミングを利用して大きな応答を効率的に処理します。

Using httpx 同期 API

async def でエンドポイントを定義したくない場合は、httpx の同期 API を選択しますが必要になります。このアプローチにより、スレッドの安全性が維持され、エンドポイントの実装が簡素化されます。

from httpx import Client
from fastapi import FastAPI, Request

app = FastAPI()

@app.on_event("startup")
def startup_event():
    app.state.client = Client()

@app.on_event('shutdown')
async def shutdown_event():
    await app.state.client.aclose()

@app.get('/')
def home(request: Request):
    client = request.state.client
    req = client.build_request('GET', 'https://www.example.com')
    try:
        r = client.send(req)
        content_type = r.headers.get('content-type')
    except Exception as e:
        content_type = 'text/plain'
        e = str(e)

    if content_type == 'application/json':
        return r.json()
    elif content_type == 'text/plain':
        return PlainTextResponse(content=r.text)
    else:
        return Response(content=r.content)

この例では、同期 API は try/Except ブロック内で HTTP リクエストを処理し、リクエスト中に発生する可能性のある例外を適切に処理できるようにします。

追加の機能と考慮事項

  • 非同期 API利点: 非同期 API は優れたパフォーマンスを提供し、同時リクエストでより効率的に拡張できます。
  • ストリーミング レスポンス: リクエストまたはレスポンスで大量のデータを処理する場合は、ストリーミング レスポンスを使用します。
  • 接続プールの制御: を作成するときに、limits 引数を設定することで、接続プールの使用を最適化できます。 httpx クライアント。
  • スレッド セーフ: httpx はスレッド セーフになるように設計されており、複数のスレッドにわたって信頼性の高い実行が保証されます。

httpx とその機能を活用することで、 FastAPI 内でダウンストリーム HTTP リクエストを自信を持って行うことができ、複数の同時タスクをシームレスに処理し、アプリケーションの安定性を確保できます。

以上がhttpx はどのようにして FastAPI でのダウンストリーム HTTP リクエストを安全かつ効率的に強化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。