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

Django / أساس الطلب والبيانات / الدرس 5

النماذج والتحقق وCSRF

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

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

أهداف الدرس

  • النموذج عقد مدخل
  • التحقق بعينة نموذج محلية كاملة
  • تمييز التحقق وحماية الطلب

النموذج عقد مدخل

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

جعل التصحيح جزءا من العمل

يحفظ النموذج القيم الآمنة ويربط الأخطاء والشرح ويدل على الإصلاح. طابق الإلزام والطول والمجال بالعملية لا سعة العمود. استخدم clean للفحص المشترك وحدد خطأ الحقل والعام. لا تستبدل التسمية بـplaceholder أو المعنى باللون. راجع البنية الميسرة مع الأخطاء، ولا تعوض قيود المتصفح تحقق الخادم. وتظهر قيمة الاختبار عند وجود الخطأ لا في الشكل الفارغ وحده؛ إذ يجب أن يعرف المستخدم أي حقل يصلح وكيف يعيد المحاولة دون فقد مدخلاته الآمنة.

التحقق بعينة نموذج محلية كاملة

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

python مثال تنفيذي معزول
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 import forms

class SeatRequestForm(forms.Form):
    name = forms.CharField(max_length=60)
    quantity = forms.IntegerField(min_value=1, max_value=5)

good = SeatRequestForm({"name": "Mira", "quantity": "3"})
bad = SeatRequestForm({"name": "Mira", "quantity": "0"})
print(good.is_valid(), good.cleaned_data["quantity"], type(good.cleaned_data["quantity"]).__name__)
print(bad.is_valid(), "quantity" in bad.errors)
الناتج المتوقع
True 3 int
False True

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

حماية كتابة المتصفح بآلية CSRF

المقطع قالب POST داخلي بمحرك مهيأ وسياق الطلب ووسيط CSRF، فتضيف الوسمة الرمز الخفي. ليس رمز مصادقة ولا إذنا للعملية. لا ترسله لوجهة خارجية. يحتاج AJAX الترتيب الموثق أيضا. شخص 403 بالارتباط والرمز والأصل والوكيل لا csrf_exempt علاجا عاما. كما أن وصول الرمز لا يمنح صلاحية العملية، ولا ينبغي تسريبه إلى جهة خارجية لمجرد إعادة استخدام قالب نموذج داخلي في موضع آخر.

html مقطع يتطلب سياق التطبيق
<form method="post" action="{% url 'seat-request' %}">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Request seats</button>
</form>
الناتج المتوقع
In its declared app context: labeled form controls and a hidden CSRF token for the internal POST.

يتطلب المسار والنموذج والعرض بسياق الطلب والوسيط، وليس مستندا مستقلا أو طلبا منفذا.

تمييز التحقق وحماية الطلب

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

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

يستخدم الخام بعد النجاح

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

يصلح CSRF بالتعطيل

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

يعد النموذج الصحيح حجزا

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

اختبر فهمك

1. لماذا تستخدم cleaned_data بعد is_valid؟

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

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

2. هل يبيح رمز CSRF صحيح تعديل حجز غيره؟

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

لا؛ يجب أن يصادق العرض ويقيد البحث ويفوض ويتحقق ويحفظ الثابت. لا يعوض الرمز هذه القرارات.

أهم ما تعلمته

  • تتحقق النماذج المرتبطة من الإرسال.
  • المنظف والخام حدان مختلفان.
  • لا تعوض CSRF الهوية والإذن.

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