تكرار السؤال: …
الإجابة المختصرة
WSGI معيار متزامن يعالج فيه كل worker طلبًا واحدًا في كل لحظة، بينما ASGI معيار غير متزامن يدعم آلاف الاتصالات و WebSockets داخل event loop. ويوفر Flask الكائنين request و g كـ proxies مرتبطة بسياق الطلب الحالي عبر context locals.
الشرح
Flask و Django التقليدي يعملان على WSGI مع خوادم مثل Gunicorn، ويتوسع الأداء بزيادة عدد العمليات والخيوط. FastAPI و Starlette و Django (في الوضع غير المتزامن) تعمل على ASGI مع خوادم مثل Uvicorn. في Flask يُدفع سياق التطبيق والطلب تلقائيًا أثناء معالجة الطلب، لذلك استخدام request أو current_app خارجهما (مثل في سكربت أو مهمة خلفية) يرمي RuntimeError: Working outside of application context، والحل app.app_context().
مثال بالكود
from flask import Flask, g, request
app = Flask(__name__)
@app.before_request
def load_user():
g.user = find_user(request.headers.get("Authorization"))
@app.get("/me")
def me():
return {"email": g.user.email}
# خارج الطلب (CLI أو مهمة)
with app.app_context():
init_db()
# gunicorn -w 4 app:app (WSGI)
# uvicorn main:app --workers 4 (ASGI)أخطاء شائعة
- الوصول إلى request داخل thread أو مهمة خلفية بعد انتهاء الطلب.
- تشغيل خدمة WebSockets على خادم WSGI.