FastAPI / المتقدم: الحياة وتصميم خدمة موثوقة / الدرس 15
البرمجيات الوسيطة وCORS والملاحظة
أضف سلوكا مشتركا محدودا مع حفظ حدود الرد والخطأ والأصل والأمن.
في هذه الصفحة
أهداف الدرس
- اشرح افتراضات وحدود موضوع «البرمجيات الوسيطة وCORS والملاحظة».
- فسر المثالين الكاملين وعلل المخرجات الملاحظة.
- شخص الإخفاقات وطبق الحلول المشروحة مع وضوح ملكية الهوية والحالة ودورة الحياة.
تحيط الوسيطة بحد التطبيق
تراقب الوسيطة وتعدل معالجة مشتركة ويتغير نطاقها بالموقع، ولا تضع كل عمل فيها لشمولها. يتحقق المثال من معرف عام صغير ويرده للربط لا للهوية. لا تسلسل الطلب والبيئة لتكشف الاعتماد وتستهلك ذاكرة بجسم مفتوح.
import re
from fastapi import FastAPI, Request
from fastapi.testclient import TestClient
app = FastAPI()
@app.middleware("http")
async def correlation(request: Request, call_next):
candidate = request.headers.get("X-Request-ID", "")
request.state.request_id = candidate if re.fullmatch(r"[a-z0-9-]{1,40}", candidate) else "lab-generated"
response = await call_next(request)
response.headers["X-Request-ID"] = request.state.request_id
return response
@app.get("/health")
def health(): return {"ok": True}
with TestClient(app) as client:
print(client.get("/health", headers={"X-Request-ID": "lab-a"}).headers["X-Request-ID"])
print(client.get("/health", headers={"X-Request-ID": "x" * 80}).headers["X-Request-ID"])
lab-a
lab-generated
يرد القصير ويستبدل الطويل ببديل اصطناعي ثابت، ويحتاج توليد الإنتاج سياسة ولا يمنح الربط هوية.
تفسير توقيت الرد بأمانة
قد يقيس call_next جزءا لا كل تدفق وخلفية وآثار، ولا يثبت العدد صحة العمل. اختر الاسم والوحدة والنافذة والقالب، وتجنب معرفات وروابط غير محدودة وحساسة. استخدم تسميات محدودة وتفصيلا مضبوطا واختبر الخطأ والمبكر والتحقق والتدفق لا 200 البسيطة فقط.
CORS سياسة وصول المتصفح للرد
تضبط CORS قراءة سكربت المتصفح لا الهوية والإذن والجدار أومنع غير المتصفح. يسمح المثال أصلا ويرفض preflight ثم يعيد GET200 بلا ترويسة سماح. صرح بالأصول والطرق والترويسات والاعتماد ولا تجعل wildcard بديلا للمراجعة خصوصا للمتصفح ذي الاعتماد.
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.testclient import TestClient
app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["https://client.example.invalid"], allow_credentials=True, allow_methods=["GET"], allow_headers=["X-Lab"])
@app.get("/resource")
def resource(): return {"public": True}
with TestClient(app) as client:
allowed = client.options("/resource", headers={"Origin": "https://client.example.invalid", "Access-Control-Request-Method": "GET"})
denied = client.options("/resource", headers={"Origin": "https://other.example.invalid", "Access-Control-Request-Method": "GET"})
direct = client.get("/resource", headers={"Origin": "https://other.example.invalid"})
print(allowed.status_code, allowed.headers["access-control-allow-origin"])
print(denied.status_code)
print(direct.status_code, direct.headers.get("access-control-allow-origin"))
200 https://client.example.invalid
400
200 None
ينجح preflight المسموح ويرفض الآخر 400، وتبقى GET200 بلا سماح لتبين أن CORS ليست إذن خادم.
مراجعة الخطأ والوكيل
يحدد الترتيب ترويسات الخطأ فاختبره. ثقة المضيف والوكيل مستقلة ولا تثق بالمحول والهوية وIP دون حد معتمد. يحتاج الجسم والتدفق ملكية وحدودا كي لا يستهلك التسجيل المدخل أويحجب المعالج. اختر ASGI أدنى عند تجاوز حدود الوسيلة واختبر الإصدار.
التحقق من ملاحظة مفيدة دون تصدير خارجي
اختبر الربط والأصول والغائب والخطأ بطلبات داخلية بلا خلفية أومصدر أومتصفح أو خدمة شبكة. لا يتصل المثال بالأصل فهو قيمة ترويسة. يحتاج الإنتاج احتفاظا ووصولا وحجبا وفشلا وكلفة؛ والهدف دليل العقد لا كل بايت أو CORS بديل أمن.
الأخطاء الشائعة وإصلاحها
تستخدم CORS كمصادقة
- لماذا يحدث؟
- اختلط وصول المتصفح بالسلطة.
- كيف تصلحه؟
- نفذ الهوية والصلاحية مستقلة.
- كيف تتجنب تكراره؟
- اختبر غير المتصفح والممنوع مستقلة.
يستهلك التسجيل بيانات حساسة بلا حد
- لماذا يحدث؟
- أغفلت الوسيطة الميزانية والخصوصية.
- كيف تصلحه؟
- استخدم بيانات محدودة وملكية صحيحة.
- كيف تتجنب تكراره؟
- اختبر الحجب والتدفق والكبير.
يعد توقيت الوسيطة اكتمال العمل كله
- لماذا يحدث؟
- أغفل التدفق والخلفية.
- كيف تصلحه؟
- سم وقس المرحلة الفعلية.
- كيف تتجنب تكراره؟
- اربط المقياس بنتيجة المستخدم والمهمة.
اختبر فهمك
1. يرسل أصل غير مسموح GET ويعود 200. هل يثبت خلل CORS؟
اعرض الحل المشروح
لا؛ تخص السياسة كشف الرد لا منع كل طلب. افحص الترويسات وافرض الأمن مستقلا؛ ويختلف preflight والمباشر.
2. لماذا يحد معرف الطلب ويستبعد من الهوية؟
اعرض الحل المشروح
لأنه سياق عميل قد يضخم أويحمل غير المرغوب؛ فتحقق أواستبدل وافصل الهوية. لا يثبت الشكل المرسل أوحقه.
أهم ما تعلمته
- تراقب الوسيطة وتعدل معالجة مشتركة ويتغير نطاقها بالموقع، ولا تضع كل عمل فيها لشمولها.
- تضبط CORS قراءة سكربت المتصفح لا الهوية والإذن والجدار أومنع غير المتصفح.
- اختبر الربط والأصول والغائب والخطأ بطلبات داخلية بلا خلفية أومصدر أومتصفح أو خدمة شبكة.