الوحدة 2 — التحقّق من المدخلات مع Pydantic
في الوحدة السابقة رأينا أنّ FastAPI يبني توثيقًا آليًّا من تلميحات الأنواع. القيمة الحقيقيّة تظهر عندما نُصرّح بمدخلاتنا كأصناف Pydantic كاملة. عندها يصبح لكلّ حقل نوع، ونطاق، وقيمة افتراضيّة اختياريّة، ومثال يظهر في التوثيق التفاعليّ. أيّ خرق يُعيد استجابة 422 مُهيكلة تشرح الحقل الخاطئ للعميل، من دون سطر واحد للتحقّق مكتوب باليد.
الطلب: مخطّط ChurnRequest
نموذج تسرّب المشتركين يستهلك ستّة متغيّرات: مدّة الاشتراك بالأشهر، الفاتورة الشهريّة، نوع العقد، طريقة الدفع، وجود خدمة الإنترنت من نوع فيبر، ووجود خدمة الحماية. نبني الصنف مباشرة:
from typing import Literal
from pydantic import BaseModel, Field
class ChurnRequest(BaseModel):
tenure_months: int = Field(
...,
ge=0,
le=120,
description="مدّة اشتراك العميل بالأشهر (0 إلى 120)",
examples=[24],
)
monthly_charges: float = Field(
...,
gt=0,
le=500,
description="الفاتورة الشهريّة بالدولار",
examples=[79.50],
)
contract: Literal["month-to-month", "one-year", "two-year"] = Field(
..., examples=["month-to-month"]
)
payment_method: Literal[
"electronic-check", "mailed-check", "bank-transfer", "credit-card"
] = Field(..., examples=["electronic-check"])
fiber_optic: bool = Field(..., examples=[True])
online_security: bool = Field(..., examples=[False])
Field(...) مع النقاط الثلاث يعلن أنّ الحقل إلزاميّ؛ حذف الحقل عند الطلب يُعيد 422. ge، le، gt، lt تفرض قيودًا رقميّة. Literal[...] يحصر القيم النصّيّة في قائمة مغلقة، فيمنع خطأ مطبعيّ مثل Monthly بدل month-to-month. examples تضع قيمة نموذجيّة في Swagger UI لتسهيل الاختبار.