عندما يتعلق الأمر ببناء واجهات برمجة التطبيقات، فإن السرعة والكفاءة هما كل شيء. يبحث المطورون دائمًا عن أدوات يمكن أن تقدم نتائج بسرعة، مع الحد الأدنى من الحمل. نقدم لكم FastAPI، وهو إطار عمل ويب حديث وسريع (ومن هنا جاءت التسمية) لبناء واجهات برمجة التطبيقات باستخدام Python 3.7+ بناءً على تلميحات النوع القياسية في Python. ولكن اليوم، لا نتحدث فقط عن FastAPI بشكل عام — نحن نغوص في شيء أكثر تحديدًا: استجابة البث في FastAPI. إذا كنت تبحث عن التعامل مع مجموعات بيانات كبيرة أو نقل بيانات في الوقت الحقيقي، فإن استجابات البث هي أفضل أصدقائك الجديدة.
ما هو FastAPI؟
قبل أن نغوص في التفاصيل الدقيقة لاستجابات البث، دعونا نستعرض باختصار ما يتعلق به FastAPI. FastAPI هو إطار عمل ويب مبني على Starlette للأجزاء المتعلقة بالويب وPydantic للأجزاء المتعلقة بالبيانات. تكمن جماليات FastAPI في سرعته — فهو واحد من أسرع إطارات البرمجة في Python المتاحة، وهو قريب من سرعة NodeJS وGo. تم تصميمه لمساعدة المطورين على بناء واجهات برمجة التطبيقات بسرعة وكفاءة، مع الحد الأدنى من التعليمات البرمجية.

لماذا FastAPI؟
إذا كنت قد عملت مع إطارات مثل Django أو Flask، فأنت تعرف أنها قوية، ولكن يمكن أن تكون بطيئة وغير مريحة عند التعامل مع واجهات برمجة التطبيقات المعقدة. من ناحية أخرى، تم تحسين FastAPI للأداء، مما يسمح لك بكتابة كود Python نظيف ومعزول باستخدام الأنواع، والذي هو كفء وسهل الفهم. مع قدراته غير المتزامنة، فهو مناسب تمامًا للتطبيقات الحديثة التي تتطلب معالجة بيانات في الوقت الحقيقي.
لكن دعنا نصل إلى النقطة—ما هي بالضبط استجابة البث، ولماذا يجب أن تهتم؟
فهم استجابات البث
ما هي استجابة البث؟
تسمح لك استجابة البث بإرسال أجزاء من استجابتك مرة أخرى إلى العميل بينما لا تزال بقية بياناتك قيد المعالجة. هذه مفيدة بشكل خاص عند التعامل مع مجموعات بيانات كبيرة أو بيانات في الوقت الحقيقي تحتاج إلى تسليمها إلى العميل بمجرد توفرها.
فكر في الأمر كما لو كنت تشاهد حدث رياضي مباشر عبر الإنترنت. بدلاً من الانتظار لإنهاء الحدث بالكامل قبل أن تتمكن من مشاهدته، يتم بث الفيديو إلى جهازك في الوقت الحقيقي، مما يسمح لك بمشاهدة الأحداث بينما تتكشف. بالمثل، مع استجابات البث في FastAPI، يمكن لواجهة برمجة التطبيقات الخاصة بك البدء في إرسال البيانات إلى العميل بمجرد أن تكون جاهزة، دون الانتظار حتى يتم معالجة جميع البيانات.
لماذا استخدام استجابات البث؟
هناك العديد من السيناريوهات التي تكون فيها استجابات البث ليست مفيدة فحسب، بل أساسية:
- التعامل مع ملفات كبيرة: عندما تحتاج إلى إرسال ملفات ضخمة (مثل الفيديو أو المجموعات البيانية) إلى عميل، يقوم بثها بتقليل الحمل على الذاكرة في خادمك وتسريع عملية التسليم.
- بيانات في الوقت الحقيقي: بالنسبة للتطبيقات مثل أنظمة الدردشة، وتحديثات الرياضات الحية، أو شاشات التحديث المالية، فإن بيانات الوقت الحقيقي هي أمر حاسم. يسمح البث بإرسال البيانات بمجرد توفرها، مما يضمن أن العميل يحصل على أحدث المعلومات.
- تحسين تجربة المستخدم: من خلال إرسال البيانات في أجزاء، يمكن للمستخدم البدء في معالجة أو عرض البيانات على الفور، دون انتظار الاستجابة الكاملة. هذا يحسن السرعة المدركة وسرعة استجابة تطبيقك.
الآن بعد أن غطينا الأساسيات، دعنا نلقي نظرة على كيفية تنفيذ استجابات البث في FastAPI.
تنفيذ استجابات البث في FastAPI
الإعداد الأساسي
أولاً وقبل كل شيء، تأكد من تثبيت FastAPI. يمكنك القيام بذلك عن طريق تشغيل:
pip install fastapi
pip install uvicorn
ستحتاج أيضًا إلى Uvicorn، وهو خادم ASGI لخدمة تطبيق FastAPI الخاص بك. بمجرد إعداد ذلك، دعنا نغوص في بعض الكود.
مثال بسيط
إليك مثال أساسي لكيفية تنفيذ استجابة بث في FastAPI:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import time
app = FastAPI()
def fake_video_streamer():
for i in range(10):
yield f"إطار {i}\n"
time.sleep(1)
@app.get("/video")
async def video():
return StreamingResponse(fake_video_streamer(), media_type="text/plain")
في هذا المثال، تع模拟 وظيفة fake_video_streamer تدفق الفيديو عن طريق توليد إطار جديد كل ثانية. يتم استخدام فئة StreamingResponse لإرسال هذه الإطارات إلى العميل كلما تم إنشاؤها، بدلاً من الانتظار حتى تكون جميع الإطارات جاهزة.
تفصيلها
- fake_video_streamer(): هذه الوظيفة المولدة تحاكي إنشاء إطارات الفيديو. كل
yieldترسل قطعة جديدة من البيانات إلى العميل. - StreamingResponse: تأخذ هذه الفئة في FastAPI مولدًا (أو أي شيء قابل للتكرار) كمدخلات وتقوم ببثها إلى العميل. يحدد المعامل
media_typeنوع البيانات المرسلة — في هذه الحالة، نص عادي.
تطبيق في العالم الحقيقي: بث ملف كبير
بث استجابات نصية صغيرة هو أمر ما، ولكن ماذا لو كنت بحاجة إلى إرسال ملف كبير؟ إليك كيفية القيام بذلك:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
app = FastAPI()
def file_reader(file_path):
with open(file_path, "rb") as file:
while chunk := file.read(1024):
yield chunk
@app.get("/download")
async def download_file():
file_path = "large_file.zip"
return StreamingResponse(file_reader(file_path), media_type="application/octet-stream")
في هذا المثال، تقوم وظيفة file_reader بقراءة ملف كبير في قطع من 1024 بايت وبثه إلى العميل.
تحسين استجابات البث
إدارة استخدام الذاكرة
واحدة من الفوائد الأساسية لاستجابات البث هي تقليل استخدام الذاكرة. ومع ذلك، إذا لم يتم التعامل معها بشكل صحيح، يمكن أن يستهلك البث الكثير من الذاكرة، خاصة عند التعامل مع عدة عملاء أو مجموعات بيانات كبيرة جدًا.
- حجم القطعة: يمكن أن يؤثر حجم كل قطعة تُبث بشكل كبير على الأداء. القطع الأكبر تعني طلبات أقل ولكن استخدام ذاكرة أكثر. القطع الأصغر تقلل من استخدام الذاكرة ولكن تزيد من عدد الطلبات. العثور على التوازن الصحيح هو المفتاح.
- التحميل الكسول: إذا كانت مصدر بياناتك تدعمه، استخدم تقنيات التحميل الكسول لتحميل البيانات فقط حسب الحاجة، بدلاً من تحميل كل شيء في الذاكرة دفعة واحدة.
البث غير المتزامن
تجعل الطبيعة غير المتزامنة لـ FastAPI مناسبة تمامًا لاستجابات البث. من خلال استخدام async وawait، يمكنك التأكد من أن البث الخاص بك لا يحظر الأجزاء الأخرى من تطبيقك، مما يسمح لك بالتعامل مع عدة عملاء في نفس الوقت دون التنازل عن الأداء.
إليك مثال:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import aiofiles
app = FastAPI()
async def async_file_reader(file_path):
async with aiofiles.open(file_path, 'rb') as file:
while chunk := await file.read(1024):
yield chunk
@app.get("/async-download")
async def async_download_file():
file_path = "large_file.zip"
return StreamingResponse(async_file_reader(file_path), media_type="application/octet-stream")
في هذا المثال، نستخدم aiofiles لقراءة الملف بشكل غير متزامن، مما يضمن أن الخادم يمكنه الاستمرار في معالجة طلبات أخرى أثناء بث الملف.
استخدام المهام في الخلفية
أحيانًا، قد ترغب في معالجة البيانات في الخلفية أثناء بث الاستجابة. مهام الخلفية لـ FastAPI مثالية لذلك.
from fastapi import FastAPI, BackgroundTasks
from fastapi.responses import StreamingResponse
app = FastAPI()
def background_data_processor():
# معالجة البيانات في الخلفية
pass
def data_streamer():
for i in range(10):
yield f"بيانات {i}\n"
@app.get("/data")
async def stream_data(background_tasks: BackgroundTasks):
background_tasks.add_task(background_data_processor)
return StreamingResponse(data_streamer(), media_type="text/plain")
في هذا المثال، تقوم وظيفة background_data_processor بمعالجة البيانات في الخلفية بينما تقوم data_streamer ببث الاستجابة إلى العميل.
التحديات والاعتبارات
معالجة الأخطاء
عند التعامل مع استجابات البث، تصبح معالجة الأخطاء أمرًا حاسمًا. نظرًا لأنه يتم إرسال البيانات في قطع، فإن أي خطأ يحدث أثناء العملية يمكن أن يؤدي إلى استجابة غير مكتملة أو تالفة.
- إيقافات هادئة: تأكد من أن تطبيقك يمكنه التعامل مع الإيقاف بهدوء، مما يكمل أو يلغي البث حسب الحاجة.
- انقطاع العميل: كن مستعدًا للسيناريوهات التي ينقطع فيها العميلMID خلال البث. يجب أن يكشف تطبيقك عن هذا وتنظيف الموارد وفقًا لذلك.
الاعتبارات الأمنية
يمكن أن تقدم استجابات البث تحديات أمنية، خاصة عند التعامل مع ملفات كبيرة أو بيانات حساسة.
- تحديد معدل الوصول: قم بتنفيذ تحديد معدل الوصول لمنع الإساءة، خاصة لواجهات برمجة التطبيقات العامة.
- التحقق من البيانات: تأكد من أن جميع البيانات التي يتم بثها يتم التحقق منها وتنظيفها بشكل صحيح لمنع هجمات الحقن.
أفضل الممارسات لاستجابات البث في FastAPI
استخدام أنواع بيانات مناسبة
حدد دائمًا نوع media_type الصحيح عند استخدام StreamingResponse. لا يساعد ذلك فقط العميل على فهم كيفية التعامل مع البيانات ولكن يمكن أيضًا تحسين الأداء من خلال السماح للعميل بمعالجة البيانات بشكل أكثر كفاءة.
المراقبة وتسجيل الأحداث
يمكن أن تكون استجابات البث صعبة التصحيح، خاصة عند حدوث مشاكل. قم بتنفيذ تسجيل شامل ومراقبة لتتبع أداء نقاط انتهاء البث الخاصة بك والتعرف بسرعة على أي مشاكل.
تقنيات متقدمة: دمج البث مع WebSockets
لتطبيقات الاستخدامات الأكثر تقدمًا، يمكنك دمج استجابات البث في FastAPI مع WebSockets. يسمح لك هذا الجمع بإنشاء تطبيقات تفاعلية للغاية في الوقت الحقيقي، مثل لوحات التحكم الحية، أو الألعاب المتعددة اللاعبين، أو الأدوات التعاونية.

مثال: بث باستخدام WebSockets
إليك مثال بسيط حول كيفية استخدام WebSockets لتطبيق دردشة في الوقت الحقيقي:
from fastapi import FastAPI, WebSocket
from fastapi.responses import StreamingResponse
app = FastAPI()
clients = []
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
clients.append(websocket)
try:
while True:
data = await websocket.receive_text()
for client in clients:
await client.send_text(f"رسالة: {data}")
except Exception as e:
clients.remove(websocket)
لماذا استخدام WebSockets مع البث؟
- الاتصال ثنائي الاتجاه: يسمح WebSockets بالتواصل الثنائي في الوقت الحقيقي بين العميل والخادم، وهو مثالي مثل التطبيقات مثل الدردشة أو التحديثات الحية.
- زمن الاستجابة المنخفض: تم تصميم WebSockets للتواصل ذو زمن استجابة منخفض، مما يجعلها مثالية للتطبيقات الحساسة للوقت.
يسمح دمج WebSockets مع استجابات البث بإنشاء تطبيقات تفاعلية وفعالة للغاية في الوقت الحقيقي.
الخاتمة
تقدم استجابات البث في FastAPI أداة قوية للتعامل مع بيانات الوقت الحقيقي، والملفات الكبيرة، وتحسين أداء واجهة برمجة التطبيقات ككل. سواء كنت تبني تطبيقًا رياضيًا حيًا، أو خدمة بيانات مالية، أو تحتاج فقط إلى إرسال ملفات كبيرة بكفاءة، فإن FastAPI تلبي احتياجاتك.
ولا تنسَ—إذا كنت تبحث عن اتخاذ تطوير واجهات برمجة التطبيقات الخاصة بك إلى المستوى التالي، تحقق من Apidog. إنها أداة قوية يمكن أن تسهل مشاريع FastAPI الخاصة بك وأكثر من ذلك بكثير. قم بتنزيلها مجانًا وانظر كيف يمكن أن تجعل عملية تطويرك أكثر سلاسة وكفاءة.
