"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني تجنب أخطاء "ConnectionClosed" عند إجراء طلبات HTTP المتزامنة في FastAPI باستخدام Uvicorn؟

كيف يمكنني تجنب أخطاء "ConnectionClosed" عند إجراء طلبات HTTP المتزامنة في FastAPI باستخدام Uvicorn؟

تم النشر بتاريخ 2024-12-21
تصفح:287

How Can I Avoid

تقديم طلبات HTTP في Uvicorn/FastAPI

عند التعامل مع نقاط نهاية HTTP التي تم إنشاؤها باستخدام FastAPI وUvicorn، من الشائع طلب البيانات من واجهات برمجة التطبيقات الخارجية. ومع ذلك، عند التعامل مع طلبات متزامنة متعددة، قد تنشأ أخطاء مثل "لا يمكن التعامل مع نوع الحدث ConnectionClosed عندما يكون الدور = الخادم والحالة = SEND_RESPONSE". يحدث هذا لأن مكتبة عميل HTTP الافتراضية، "الطلبات"، ليست آمنة تمامًا لمؤشر الترابط عند استخدامها في مثل هذه البيئة المتزامنة.

لحل هذه المشكلة، فكر في تنفيذ مكتبة عميل HTTP البديلة التي تسمى httpx. إنه يوفر واجهة برمجة تطبيقات غير متزامنة تساعد على تجنب مشكلات أمان سلسلة الرسائل داخل FastAPI. يوضح المثال أدناه كيفية استخدام httpx في FastAPI:

from fastapi import FastAPI, Request, BackgroundTask
from fastapi.responses import StreamingResponse, Response
from contextlib import asynccontextmanager
import httpx

@asynccontextmanager
async def lifespan(app: FastAPI):
    async with httpx.AsyncClient() as client:
        yield {'client': client}

app = FastAPI(lifespan=lifespan)

@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())) 

من خلال استخدام واجهة برمجة التطبيقات غير المتزامنة الخاصة بـ httpx، يمكنك التعامل مع طلبات HTTP داخل FastAPI بشكل أكثر كفاءة مع الحفاظ على أمان سلسلة الرسائل. يمكنك أيضًا تخصيص حجم تجمع الاتصال باستخدام وسيطة الكلمة الأساسية "الحدود" في كائن العميل.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3