ایجاد الگوهای URLs


قبل از شروع مبحث، باید خاطر نشان کنیم که در جنگو، برای داشتن کد تمیز و حفظ نظم در ساختار پروژه و همچنین برای بالا بردن قابلیت reuse اپلیکیشن ، بهتر است که الگوهای URL هر اپلیکیشن، در فایل URL مختص آن اپ صورت پذیرد و به عبارتی دیگر، یک فایل urls.py مجزا برای هر اپلیکیشن، داشته باشیم.  

به­ دلیل عدم ایجاد فایل urls.py اختصاصی به­ صورت پیش‌فرض در هنگام تعریف app، می­‌بایست یک فایل با نام urls.py در دایرکتوری app ایجاد کرده و الگوهای URL مختص آن را تعریف کنیم.

الگوهای URL ای که تعریف می‌کنیم امکان اتصال هر URL را به view مورد نظر فراهم می‌کنند. برای این منظور پس از وارد کردن متد path از کتابخانه داخلی django.urls، می‌­بایست viewهای تعریف شده app را از فایل views.py با دستور ذیل  وارد فایل urls.py کنیم.

coreapp/urls.py

from django.urls import path
from . import views

در ادامه نیز می‌توان الگوهای URL را تعریف و درخواست­‌های URL دریافتی را به فانکشن view موردنظر ارتباط داد. برای این منظور از ویژگی urlpatterns استفاده می­‌گردد

coreapp/urls.py

urlpatterns = [
    path('home/', views.homeFunc, name='Home'),
]


در حقیقت الگوهای URL از یک متد path و سه آرگومان ورودی تشکیل می­‌شوند.

path('urlName/', views.functionName, name='alternativeName'),

―  یک الگوی متنی که آدرس URL را نمایش می­دهد.

―  یک تابع که تعیین می‌کند URL درخواست شده، چه فانکشنی از sview رو باید اجرا کند.

―  در نهایت یک اسم دلخواه برای URL که بتوان از کل پروژه توسط این نام‌گذاری به URL موردنظر، دسترسی داشت.

سیستم جنگو به این صورت است که هر الگوی URL که تعریف می‌شود را خوانده و ذخیره می‌کند و هر زمان که درخواستی (request) مطابق با آن آدرس URL دریافت کرد، فانکشنی از sview که در الگوی URL، تعریف شده را فراخوانده و اجرا می‌کند.

فایل urls.py که ایجاد کردیم، مختص app ایجاد شده است و باید در لیست URLهای ساختار ریشه پروژه نیز تعریف شود تا الگوهای URL تعریف شده در آن، به­ عنوان الگوهای پروژه جنگو نیز، تعریف و شناخته گردند. در حقیقت می­‌بایست الگوهای URL اختصاصی هر app را به الگوهای URL اصلی پروژه نیز معرفی کنیم.

برای این منظور، فایلی که با عنوان urls.py در دایرکتوری جنگوی پروژه­ tutorial قرار گرفته و در هنگام ایجاد پروژه به ­صورت پیش‌فرض ساخته شده بود را باز کرده و ماژول include را وارد می‌کنیم. طبق مستندات جنگو، ماژول include تابعی است که وظیفه وارد کردن تمامی الگوهای URL تعریف شده در دیگر appها را در جایگاهی که استفاده می‌­گردد، دارد. سپس می‌­بایست یک الگوی path() در لیست urlpatterns[ ] برای مسیردهی درخواست­‌های هر app، اضافه کنیم. با این فرآیند، تمامی الگوهای URL که در appها تعریف شده و یا خواهند شد، به ­عنوان الگوهای URL پروژه نیز شناسایی خواهند شد.

پیکربندی نهایی فایل urls.py، به شکل زیر خواهد بود. 

tutorial/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('coreapp.urls')),
    path('user/', include('clientapp.urls')),
]

❗❗❗ وقتی در فایل urls.py پروژه برای یک app از الگوی مسیر رشته‌ی خالی '' استفاده کنیم، یعنی آن app به‌عنوان مسیر اصلی (root) سایت شناخته می‌شود. در این حالت تمام آدرس‌های تعریف‌شده در آن app، مستقیماً از صفحه‌ی اصلی (/) شروع خواهند شد. باید توجه داشت که تنها یک app می‌تواند به این شکل به ریشه‌ی سایت متصل گردد و بقیه اپ‌ها باید یک prefix (مثل /user یا /api) داشته باشند، در غیراینصورت تداخل و ابهام ایجاد خواهد شد.

(venv) python manage.py runserver

حال اگر در مرورگر، الگوی آدرس /home را وارد کنیم، جنگو، URL مربوطه که همان الگوی تعریف شده Home می‌­باشد را به­‌عنوان درخواست (request) مرورگر دریافت کرده و view مربوط به این درخواست با عنوان views.homeFunc() را از الگوی URL آن فراخوانی نموده و در نهایت تابع view تعریف شده، دستور ارسال عبارت Hello World! را به­ عنوان پاسخ (response) به مرورگر، صادر کرده و در صفحه نمایش مرورگر، تصویر زیر مشاهده خواهد شد.

Django Tutorial | Hello World!

❗❗❗ اگر الگوی URL به صورت رشته خالی '' تعریف شود، مسیر به ­عنوان مسیر اصلی دامنه وب‌سایت تلقی خواهد شد و می‌توان مستقیما با وارد کردن آدرس وب‌سایت به آن دسترسی داشت:

coreapp/urls.py

urlpatterns = [
    path('', views.homeFunc, name='Home'),
]

با تعریف الگوی مسیر فوق /http://127.0.0.1:8000 مستقیما کاربر را به home/ هدایت خواهد کرد.