FastAPI / المتقدم: الحياة وتصميم خدمة موثوقة / الدرس 17
الإعداد والمضيف وحدود النشر
تحقق من الإعداد واعرض السلوك المقصود فقط مع فصل افتراض الاستضافة واختبار الداخل.
في هذه الصفحة
أهداف الدرس
- اشرح افتراضات وحدود موضوع «الإعداد والمضيف وحدود النشر».
- فسر المثالين الكاملين وعلل المخرجات الملاحظة.
- شخص الإخفاقات وطبق الحلول المشروحة مع وضوح ملكية الهوية والحالة ودورة الحياة.
الإعداد مدخل آخر غير موثوق
قد يغيب إعداد البيئة والملف والأمر أويخطئ نطاقه. تحقق من المطلوب والصيغة والحد والأولوية قبل الجاهزية. لا تقرأ BaseModel البيئة تلقائيا؛ فللإعداد تكامل مستقل. يستقبل المثال كائنا صريحا ويبني عزلا بلا اعتماد وملف، ولا تستبدل المطلوب بسكوت بعنوان إنتاج أوسر فارغ.
from fastapi import FastAPI
from fastapi.testclient import TestClient
from pydantic import BaseModel, ConfigDict, Field, ValidationError
class Settings(BaseModel):
model_config = ConfigDict(frozen=True, extra="forbid")
max_items: int = Field(gt=0, le=100)
def create_app(settings: Settings):
app = FastAPI(debug=False)
@app.get("/public-config")
def public_config(): return {"max_items": settings.max_items}
return app
with TestClient(create_app(Settings(max_items=20))) as client:
print(client.get("/public-config").json())
try:
Settings(max_items=0)
except ValidationError:
print("configuration rejected")
{'max_items': 20}
configuration rejected
يستقبل قيمة متحققة ويعرض حقلا عاما فقط دون قراءة بيئة أوملف أوسر أوخدمة.
فصل الأسرار والإعداد العام
يحتاج السر مصدرا ووصولا وتدويرا وحجبا؛ ولا يجعل الغلاف المحجوب كل تفريغ وسجل آمنا. أعد العام المقصود لا الإعداد كله، واختبر رسالة تسمي الحقل لا الاعتماد. تفيد المراجعة ومرجع السر تشخيصا وتبقى القيمة خارج السجلات والمصدر والتجهيز.
تحديد ثقة المضيف والوكيل صراحة
ترفض TrustedHost المضيف غير المدعوم، ويختبر المثال الداخلي والمرفوض دون DNS. لا تصادق المستخدم أوتحدد ثقة ترويسات الوكيل؛ فلـTLS وroot_path وإعادة المسار والعنوان عقد نشر. لا تجعل ترويسة عشوائية هوية أورابطا حساسا، وافحص البنية بإذن لا ادعاء من العميل.
from fastapi import FastAPI
from fastapi.testclient import TestClient
from starlette.middleware.trustedhost import TrustedHostMiddleware
app = FastAPI()
app.add_middleware(TrustedHostMiddleware, allowed_hosts=["testserver"])
@app.get("/health")
def health(): return {"ok": True}
with TestClient(app) as client:
print(client.get("/health").status_code)
print(client.get("http://other.example.invalid/health").status_code)
200
400
ينجح المضيف ويرفض الآخر 400، وكلاهما نقل داخلي بلا حل أواتصال.
استخدام حدود موارد ونقل مستقلة
لا يحد الحقل حجم الجسم والرفع والرد والزمن والتزامن. طبق الحدود بموضعها واختبرها، واملك التدفق دون تجميع الكل. يغير عدد العمال الطلب وتبقى الذاكرة والمجمع محليين إلا بتصميم. لا تعمم العمال والمهلة والذاكرة؛ بل اختر بقياس مصرح وحمل وفشل صريحين.
فصل الجاهزية والطرح والاستعادة
الرد السليم ملاحظة واحدة، وتحتاج الجاهزية إعدادا واعتمادا وقبولا وإغلاقا. سجل الحزمة والإصدار والمخطط والإعداد والسر، وحد البدء والإنهاء بسماح المنصة وتوافق الرجوع. لا تستخدم الأمثلة خادما أووكيلا أونشرا أوسحابة أوبيئة حقيقية أومخزنا؛ وتثبت المحلي لا نشر إنتاج آمن.
الأخطاء الشائعة وإصلاحها
يكشف تفريغ الإعداد للتصحيح
- لماذا يحدث؟
- لم يفصل العام والحساس.
- كيف تصلحه؟
- اعرض المسموح الآمن فقط.
- كيف تتجنب تكراره؟
- اختبر الحجب اصطناعيا.
يعد حد استعلام حماية حجم الرفع
- لماذا يحدث؟
- اختلط الحقل والنقل.
- كيف تصلحه؟
- طبق وافحص حد البايت والحياة.
- كيف تتجنب تكراره؟
- وثق حد ووحدة الضبط.
توثق ترويسات الوكيل من الجميع
- لماذا يحدث؟
- استنتجت الثقة من وجود الترويسة.
- كيف تصلحه؟
- حدد الوكيل وعقد الخادم.
- كيف تتجنب تكراره؟
- اختبر الاستضافة مستقلة.
اختبر فهمك
1. هل يثبت نجاح المضيف صلاحية المستخدم؟
اعرض الحل المشروح
لا؛ يثبت المضيف فقط وتبقى الهوية والإذن وTLS والوكيل والبيانات مستقلة، فاختبر كلا بنطاقه.
2. لماذا يرفض البدء اعتمادا مطلوبا غائبا لا نصا فارغا؟
اعرض الحل المشروح
قد يعلن جاهزية ويفشل لاحقا أويصل الخطأ؛ فتحقق مبكرا وسم الحقل بأمان ولا تجهز قبل العقد.
أهم ما تعلمته
- قد يغيب إعداد البيئة والملف والأمر أويخطئ نطاقه.
- ترفض TrustedHost المضيف غير المدعوم، ويختبر المثال الداخلي والمرفوض دون DNS.
- الرد السليم ملاحظة واحدة، وتحتاج الجاهزية إعدادا واعتمادا وقبولا وإغلاقا.