Django / أساس الطلب والبيانات / الدرس 3
العروض والطرق وردود HTTP الصادقة
اكتب معالجات صغيرة تعبر طرقها وتحققها وأنواعها وحالاتها عن العملية الحقيقية.
في هذه الصفحة
أهداف الدرس
- العرض يملك حد طلب
- تقييد الطريقة المعلنة صراحة
- رصد الأخطاء دون تسريب الداخل
العرض يملك حد طلب
يقبل عرض الدالة طلبا ويعيد ردا أو استثناء يعالجه الإطار. أظهر الطريقة والتحليل والتنسيق وانقل الحساب المشترك لدوال عادية. لا تكتب بصمت عند جلب صفحة؛ لتبق GET بلا تغيير مطلوب وتكن الكتابة بتدفق مقصود محمي. ولا يثبت POST الإذن، فوثق المعنيين منفصلين. ومن المفيد أن تبقى دالة المجال مستقلة عن كائن الطلب، بحيث يمكن التحقق من حسابها دون تكرار إعداد الترويسات والمسارات في كل تجربة.
قراءة المدخل من مصدره المقصود
يمثل GET الاستعلام وPOST مدخل النموذج المدعوم لا كل جسم. يحتاج JSON فكا وتحققا بحد حجم ونوع وسياسة خطأ. قد تضم QueryDict عدة قيم للمفتاح، فحدد صلاحية التكرار. حول الأعداد وارفض الصيغة والمجال برسالة، ولا تمرر ترتيبا أو وجهة أو سمة من النص لعملية ذات صلاحية دون سماح ضيق. ويجب أن يحدد العقد سلوك المفاتيح المكررة في الاستعلام بدلا من قبول قيمة اختارتها طريقة قراءة مختصرة دون قرار واضح من التطبيق.
تقييد الطريقة المعلنة صراحة
يقيد require_GET مثالا يعاد بطلبين مصطنعين فيرفض الآخر بـ405. لا يضيف مصادقة ومحددا وCSRF، بل حد الطريقة. يثبت الاستدعاء المحلي النتيجة دون خادم. يحتاج فحص الصحة الحقيقي سياسة معلومات فلا يكشف أسرارا أو تشخيصا مكلفا. ليصف نجاحه الشرط المحدود الذي فحصه فعلا. وعند استخدام عرض للصحة التشغيلية، لا يعني نص النجاح أن قواعد البيانات أو الخدمات الأخرى سليمة ما لم يكن هذا الفحص ضمن نطاقه المعلن.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
from django.http import HttpResponse
from django.test import RequestFactory
from django.views.decorators.http import require_GET
@require_GET
def status(request):
return HttpResponse("ready", content_type="text/plain")
factory = RequestFactory()
print(status(factory.get("/status/")).status_code)
print(status(factory.post("/status/")).status_code)
200
405
يقبل GET ويرفض POST في العينة ولا يتصل بشبكة أو اعتماد صحة.
إرجاع بيانات مهيكلة بعقد واضح
يعيد JsonResponse حقولا عامة صريحة. القاموس الشكل الأعلى العادي الآمن، وتحتاج الأشكال الأخرى إعدادا وعقدا. لا تسلسل نموذجا أو طلبا كاملا لوجود المساعد. ثبت الأنواع والغياب والحالة؛ تختلف أخطاء المدخل والإذن والغياب والخادم. ليس عرض JSON إطار REST كاملا، فما زال الترقيم والمصادقة والتطور والأخطاء محتاجة تصميما. كما يجب أن يظل شكل الخطأ مستقرا للمستهلك، مع فصل الردود المفقودة والممنوعة وغير الصالحة عن الاستثناءات الداخلية غير المتوقعة.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
import json
from django.http import JsonResponse
response = JsonResponse({"course": "Django", "seats": 4}, status=200)
payload = json.loads(response.content)
print(response.status_code)
print(payload["course"], payload["seats"])
200
Django 4
يحمل الرد الحقول المختارة فقط ويبقى عدد المقاعد رقما.
رصد الأخطاء دون تسريب الداخل
التقط ما يصنفه العرض واترك غير المتوقع لحد الإبلاغ المراجع. قد تحول قائمة فارغة ناجحة لكل خطأ قاعدة الانقطاع لجواب كاذب. سجل معرفا ونوع خطأ لا كلمات ورموزا وسجلات كاملة. اختبر الحالة والنوع والحقول والطرق والتكرار والفراغ والتعافي. لا تثبت RequestFactory الوكيل والمتصفح والوسيط كاملا. وقد تخفي استجابة فارغة ناجحة انقطاعا حقيقيا وتنتج قرارا تجاريا خاطئا، لذلك لا يكفي أن يواصل العرض إرجاع JSON عند كل فشل.
الأخطاء الشائعة وإصلاحها
يغيب JSON من POST
- لماذا يحدث؟
- الجسم JSON لا نموذج مرمز.
- كيف تصلحه؟
- فك التنسيق المعلن وتحقق.
- كيف تتجنب تكراره؟
- اختبر الأنواع منفصلة.
يبدو الانقطاع دليلا فارغا ناجحا
- لماذا يحدث؟
- استبدل المعالج العام الخطأ ببيانات طبيعية.
- كيف تصلحه؟
- أبلغ بصدق واحفظ غير المتوقع.
- كيف تتجنب تكراره؟
- ميز الفشل والفراغ.
يغير عنوان قراءة السجلات
- لماذا يحدث؟
- استُخدمت GET للكتابة.
- كيف تصلحه؟
- انقلها لكتابة مفوضة محمية.
- كيف تتجنب تكراره؟
- راجع الطرق بالاختبارات.
اختبر فهمك
1. لماذا يضعف رد 200 مع خطأ منع عقد الإذن؟
اعرض الحل المشروح
قد تفسر الجهات الحالة نجاحا رغم الجسم. استخدم حالة الإذن والشكل الآمن وأكدهما، ولا تكشف كل التشخيص والبيانات للعامة.
2. صمم محلل حجم صفحة محدود.
اعرض الحل المشروح
اقبل الحقل وحوله بحد خطأ ضيق واشترط مجالا كواحد لخمسين. حدد التكرار والغياب وارفض التالف بوضوح بدلا من طلب قاعدة أو ذاكرة بلا حد.
أهم ما تعلمته
- الطريقة والتنسيق والإذن عقود منفصلة.
- طابق الحالات بالنتائج.
- سلسل الحقول العامة المقصودة فقط.