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

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

العناوين والمحولات وأسماء المسارات

اربط المسارات بالعروض بمحولات وأسماء مستقرة مع فصل التوجيه عن التفويض.

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

أهداف الدرس

  • يصف URLconf توزيع الطلب
  • حل مسار بوحدة عناوين معزولة
  • مراجعة المسار بوصفه واجهة

يصف URLconf توزيع الطلب

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

ضمانات المحولات محدودة

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

حل مسار بوحدة عناوين معزولة

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

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.http import HttpResponse
from django.urls import path, resolve

def detail(request, course_id):
    return HttpResponse(str(course_id), content_type="text/plain")

urlpatterns = [path("courses/<int:course_id>/", detail, name="course-detail")]
match = resolve("/courses/7/", urlconf=__name__)
print(match.url_name)
print(match.kwargs["course_id"], type(match.kwargs["course_id"]).__name__)
الناتج المتوقع
course-detail
7 int

يعيد الحل الاسم والوسيطة الصحيحة دون بحث سجل أو وسيط.

اعكس الأسماء بدلا من نسخ المسارات

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

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.http import HttpResponse
from django.urls import path, reverse

def detail(request, course_id):
    return HttpResponse("Local route")

urlpatterns = [path("courses/<int:course_id>/", detail, name="course-detail")]
print(reverse("course-detail", kwargs={"course_id": 7}, urlconf=__name__, query={"view": "summary"}))
الناتج المتوقع
/courses/7/?view=summary

يوفر الاسم المسار وترمز reverse الاستعلام وفق 5.2 دون تنقل.

مراجعة المسار بوصفه واجهة

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

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

يعيد مسار صحيح موردا مفقودا

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

يفشل العكس بعد تعديل

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

يخفي نمط عام مسارا خاصا

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

اختبر فهمك

1. هل يفوض <int:course_id> الوصول للمقرر 7؟

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

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

2. كيف يتجنب تطبيق قابل للإعادة ربط الروابط ببادئة /training/؟

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

عرف الأسماء والنطاق وضمن URLconf ببادئة المشروع واعكس الأسماء. يستطيع المضيف تغييرها دون كل الروابط، وتؤكد الاختبارات العناوين العامة.

أهم ما تعلمته

  • يختار التوجيه عرضا لا قرار إذن.
  • للمحولات ضمانات محدودة.
  • تسهل الأسماء والنطاقات الصيانة.

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