تقديم طلبات 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