ایجاد الگوهای 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.Home, name='Home'),
]
در حقیقت الگوهای URL از یک متد path و سه آرگومان ورودی تشکیل میشوند.
path('urlName/', views.functionName, name='alternativeName'),
― یک الگوی متنی — urlName — که آدرس URL را نمایش میدهد.
― یک تابع — functionName — که تعیین میکند URL درخواست شده، چه فانکشنی از sview رو باید اجرا کند.
― در نهایت یک اسم دلخواه — alternativeName — برای 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 میتواند به این شکل به ریشهی سایت متصل گردد و بقیه اپها باید یک پیشوند یا همان prefix (مثل /user یا /api) داشته باشند، در غیراینصورت تداخل و ابهام ایجاد خواهد شد.
(venv) python manage.py runserver
حال اگر در مرورگر، الگوی آدرس /home را وارد کنیم، جنگو، URL مربوطه که همان الگوی تعریف شده Home میباشد را بهعنوان درخواست (request) مرورگر دریافت کرده و view مربوط به این درخواست با عنوان views.homeFunc() را از الگوی URL آن فراخوانی نموده و در نهایت تابع view تعریف شده، دستور ارسال عبارت Hello World! را به عنوان پاسخ (response) به مرورگر، صادر کرده و در صفحه نمایش مرورگر، تصویر زیر مشاهده خواهد شد.

⚠️ اگر الگوی URL در لیست پترنهای خود اپ نیز به صورت رشته خالی '' تعریف گردد، مسیر به عنوان مسیر اصلی دامنه وبسایت تلقی خواهد شد و میتوان مستقیما با وارد کردن آدرس وبسایت به آن دسترسی داشت:
coreapp/urls.py
urlpatterns = [
path('', views.Home, name='Home'),
]
با تعریف الگوی مسیر فوق، درخواست آدرس /http://127.0.0.1:8000، مستقیما کاربر را به صفحه اصلی پروژه هدایت خواهد کرد.