پیکربندی URLs


ایجاد الگوهای 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) به مرورگر، صادر کرده و در صفحه نمایش مرورگر، تصویر زیر مشاهده خواهد شد.

Django Tutorial | Hello World!

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

coreapp/urls.py

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

با تعریف الگوی مسیر فوق، درخواست آدرس /http://127.0.0.1:8000، مستقیما کاربر را به صفحه اصلی پروژه هدایت خواهد کرد.

انتقال داده توسط URL


پیش از ورود به بحث اصلی، لازم است با نحوه انتقال داده‌ها به رابط کاربری آشنا شویم. فرض کنید صفحه‌ای با آدرس project/ وجود داشته باشد که عنوان یک پروژه خاص را نمایش دهد — به‌طوری‌که این عنوان از طریق داده‌های داینامیکی (مانند پارامترهای URL یا وضعیت برنامه) به رابط کاربری ارسال و سپس نمایش داده می‌شود.

 برای دسترسی به این مقصود می‌­بایست فرآیند زیر، مرحله به مرحله طی شود.

-        ابتدا در فایل URL اپ،  الگوی URL مربوطه مب‌بایست تعربف گردد و در فرآیند تعریف باید به جنگو اعلام شود که این مسیر آدرس، هنگام درخواست، نیاز به آرگومان ورودی خواهند داشت:

coreapp/urls.py

urlpatterns = [
    path('', views.Home, name='Home'),
    path('project-name/<str:title>', views.ProjectInfo, name='ProjectTitle'),
]

در این­جا، به هنگام تعریف الگوی URL، به جنگو اعلام کردیم که آدرس book-name/ به هنگام درخواست می­‌بایست یک آرگومان وروردی با عنوان title از نوع متن یا عبارت – str به همراه خود داشته باشد.

⚠️ درصورت ارسال نشدن آرگومان ورودی به هنگام درخواست URL با پیغام خطا مواجه خواهیم شد.

سپس  در تابع view مربوطه، می‌­بایست نحوه تعامل با آرگومان ورودی را تعریف کنیم:

coreapp/views.py

def ProjectInfo(request, title):

  return HttpResponse(f'Project Title is: 🡺 {title}')

حال اگر در مرورگر آدرس project-name/Django-Tutorial-Project را وارد کنیم، جنگو این درخواست را بر اساس الگوی تعریف‌شده در فایل urls.py تطبیق می‌دهد. در این الگو، بخش project-name ثابت است و هر مقداری که پس از آن آمده باشد (در اینجا Django-Tutorial-Project) به‌عنوان پارامتر title به تابع ProjectInfo() ارسال می‌شود. این ویو سپس یک پاسخ ساده شامل عبارت «Project Title is: 🡺 Django-Tutorial-Project» را تولید کرده و به مرورگر بازمی‌گرداند؛ بنابراین، کاربر دقیقاً همین متن را در صفحه مرورگر خواهد دید.

Django Tutorial | Send Variable to Display