ایجاد الگوهای 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
) به مرورگر، صادر کرده و در صفحه نمایش مرورگر، تصویر زیر مشاهده خواهد شد.
❗❗❗ اگر الگوی URL به صورت رشته خالی ''
تعریف شود، مسیر به عنوان مسیر اصلی دامنه وبسایت تلقی خواهد شد و میتوان مستقیما با وارد کردن آدرس وبسایت به آن دسترسی داشت:
coreapp/urls.py
urlpatterns = [
path('', views.homeFunc, name='Home'),
]
با تعریف الگوی مسیر فوق /http://127.0.0.1:8000 مستقیما کاربر را به home/
هدایت خواهد کرد.