محتويات الدورة

FastAPI / المتوسط: تكامل التطبيق والأمن / الدرس 12

حدود القاعدة ووحدة العمل

افصل التحقق والمستودع والمعاملة والتنظيف كي يعكس الرد نتيجة حفظ محددة.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اشرح افتراضات وحدود موضوع «حدود القاعدة ووحدة العمل».
  • فسر المثالين الكاملين وعلل المخرجات الملاحظة.
  • شخص الإخفاقات وطبق الحلول المشروحة مع وضوح ملكية الهوية والحالة ودورة الحياة.

نموذج الطلب ليس حفظا

تتحقق Pydantic ولا تحفظ صفا أوتفرض قيد قاعدة. يعبر المستودع عن السلوك وتنسق وحدة العمل التثبيت والتراجع؛ ويحقن الإطار ولا يختار المعاملة. يستخدم المثال SQLite جديدة بالذاكرة مملوكة للملف لا قاعدة المشروع أوخدمة، لشرح التراجع دون ضمان تزامن وديمومة كل محرك.

python عرض تراجع معزول كامل
import sqlite3
connection = sqlite3.connect(":memory:")
try:
    connection.execute("CREATE TABLE account (id INTEGER PRIMARY KEY, balance INTEGER NOT NULL)")
    with connection:
        connection.execute("INSERT INTO account VALUES (?, ?)", (1, 10))
    try:
        with connection:
            connection.execute("UPDATE account SET balance = ? WHERE id = ?", (7, 1))
            connection.execute("INSERT INTO account VALUES (?, ?)", (1, 2))
    except sqlite3.IntegrityError:
        pass
    print(connection.execute("SELECT balance FROM account WHERE id = ?", (1,)).fetchone()[0])
finally:
    connection.close()
الناتج المتوقع
10

يلغي المفتاح المكرر المعاملة ويبقى 10 بقاعدة خاصة بالذاكرة لا مشروع أوإثبات عزل عام.

تثبيت نتيجة مفيدة قبل إعلانها

إذا أعلن الرد حفظا دائما فيلزم نجاح التثبيت. قد يمنع تأخيره لتنظيف بعد البدء الإبلاغ الصحيح. ليست yield تصميما معاملاتيا تلقائيا؛ فحدد الفحص والكتابة والتثبيت والرد والتنظيف. صنف المعروف واحفظ السبب، ولا يثبت فشل الرد أوالمهلة غياب الكتابة؛ فقد تلزم تسوية ومنع دائم للتكرار.

توضيح ملكية الاتصال والجلسة

للجلسة قواعد خيط ومعاملة وعمر؛ فلا تشارك المتغيرة بين الطلبات والخلفية كعام. لائم المحرك وحد المجمع والانتظار والاستعلام. يحقن المثال مستودع قراءة بالذاكرة لا جلسة ليتحقق من التوصيل والغياب، ويحتاج تكامل المحرك وORM تجهيزات وإصدارات خاصة.

python اختبار حد مستودع كامل
from typing import Annotated
from fastapi import Depends, FastAPI, HTTPException
from fastapi.testclient import TestClient
def repository(): return {1: {"id": 1, "name": "pen"}}
app = FastAPI()
@app.get("/items/{item_id}")
def item(item_id: int, rows: Annotated[dict, Depends(repository)]):
    if item_id not in rows: raise HTTPException(status_code=404, detail="Missing")
    return rows[item_id]
with TestClient(app) as client:
    print(client.get("/items/1").json())
    app.dependency_overrides[repository] = lambda: {}
    try:
        print(client.get("/items/1").status_code)
    finally:
        app.dependency_overrides.clear()
الناتج المتوقع
{'id': 1, 'name': 'pen'}
404

يرى المسار مستودعا مضبوطا ثم غيابا؛ والقاموس تجهيز لا حفظا دائما أوخدمة.

حماية القيم والقيود والنطاق

اربط القيم وقيد المعرف والترتيب الديناميكي. لا يحل التحقق محل القيد والإذن والتزامن؛ فقد يجتاز طلبان رصيدا قديما، فافرض القيد قرب الكتابة بأداة المحرك. اربط النطاق بالعملية وخطط الترحيل والتوافق. يفيد القاموس للواجهة ولا يثبت عزل وقفل وتعافي قاعدة أخرى.

اختبار النجاح والتراجع والتنظيف مستقلة

افحص المثبت والفشل الوسطي والتحرير والخطأ بموارد تملكها لا مخزن التطبيق. لا يعكس التراجع رسالة أودفعا؛ فاستخدم بروتوكولا وتسوية. تنفذ الأمثلة بيانات بالذاكرة وتغلق الاتصال دون مشروع أوخدمة أومرحّل أوإدارة أواعتماد أوشبكة، ولا تدعي تحقق إنتاج.

الأخطاء الشائعة وإصلاحها

يفشل التثبيت بعد إرسال النجاح

لماذا يحدث؟
أخفي الاكتمال بتنظيف متأخر.
كيف تصلحه؟
ثبت قبل ادعاء الحفظ.
كيف تتجنب تكراره؟
اختبر فشل التثبيت عند الرد.

تعاد جلسة بين طلبات متزامنة

لماذا يحدث؟
اختلط العام بالعمر الآمن.
كيف تصلحه؟
استخدم جلسات مملوكة ومجمعا محدودا.
كيف تتجنب تكراره؟
اختبر التزامن والتنظيف بالمحرك المختار.

يفترض أن التراجع يعكس الخارجي

لماذا يحدث؟
اعتبرت الأنظمة معاملة واحدة.
كيف تصلحه؟
استخدم تنسيقا دائما وتسوية.
كيف تتجنب تكراره؟
اختبر القطع بين التثبيت والنشر.

اختبر فهمك

1. تنتهي مهلة HTTP بعد تثبيت. هل يكرر العميل الدفع عمياء؟

اعرض الحل المشروح

لا؛ قد حفظت. استخدم هوية ثابتة أوسو الحالة؛ فلا يعكس النقل القاعدة أودفعا تلقائيا.

2. لماذا لا يثبت قاموس سلوك قفل PostgreSQL؟

اعرض الحل المشروح

يثبت الواجهة والنتائج الاصطناعية فقط؛ وتحتاج خصائص المحرك تكاملا معزولا مصرحا، فحدد الدليل المحلي.

أهم ما تعلمته

  • تتحقق Pydantic ولا تحفظ صفا أوتفرض قيد قاعدة.
  • للجلسة قواعد خيط ومعاملة وعمر؛ فلا تشارك المتغيرة بين الطلبات والخلفية كعام.
  • افحص المثبت والفشل الوسطي والتحرير والخطأ بموارد تملكها لا مخزن التطبيق.

المراجع الرسمية