URL در جنگو؛ هر چیزی که راجع به آدرس دهی در جنگو باید بدانید

URL در جنگو؛ هر چیزی که راجع به آدرس دهی در جنگو باید بدانید

نوشته شده توسط: تیم فنی نیک آموز
تاریخ انتشار: ۲۸ مهر ۱۴۰۳
آخرین بروزرسانی: ۲۸ مهر ۱۴۰۳
زمان مطالعه: 22 دقیقه
۰
(۰)

URL در جنگو مانند نقشه راهی است که کاربران را به مقصد موردنظرشان می‌رساند. آیا تا به حال به این فکر کردید چگونه با کلیک روی یک لینک در یک وب‌سایت، به صفحه موردنظرتان هدایت می‌شوید؟ پاسخ این سوال در دنیای آدرس دهی جنگو نهفته است. جنگو، به عنوان یکی از محبوب‌ترین فریم‌ورک‌های پایتون برای توسعه وب، ابزاری قدرتمند برای مدیریت آدرس‌ها ارائه می‌دهد. در این مقاله، با مفاهیم کلیدی، الگوها و بهترین شیوه‌های آدرس‌دهی آشنا می‌شویم. پس از خواندن این مقاله راز و رمز فرآیند لینک‌دهی را کشف کرده و یاد می‌گیرید چگونه نسبت به آدرس دهی در جنگو اقدام کنید.

نقش URL در چارچوب جنگو

هر صفحه‌‌ای که در اینترنت می‌بینید، یک آدرس منحصربه‌فرد دارد. این آدرس به برنامه‌‌ پشت صحنه‌ سایت می‌گوید که کاربر چه چیزی را ببیند. در دنیای قدرتمند جنگو از چیزی به نام URLconf (مخفف URL configuration) استفاده می‌کنیم. URLconf مجموعه‌ای از الگوهاست که جنگو آن‌ها را با آدرس درخواستی کاربر تطبیق می‌دهد تا بهترین و مرتبط‌ترین بخش از سایت را مطابق با نیاز کاربر به او نمایش دهد. به زبان ساده، URLconf نقش یک نقشه‌ راه برای جنگو را بازی کرده و تعیین می‌کند در هر آدرس چه چیزی به کاربر نشان دهد.

این ماژول، آدرس‌های درخواستی کاربران را با توابع پایتونی مرتبط می‌کند که وظیفه‌ نمایش محتوا یا انجام عملیات خاصی را برعهده دارند. به زبان ساده‌تر، فرض کنید کاربری آدرس «/مقالات/معرفی-جاهای-دیدنی-تهران» را در مرورگر خود وارد می‌کند. URLConf این آدرس را بررسی کرده و متوجه می‌شود باید تابعی خاص را (که به آن view گفته می‌شود) برای نمایش مقاله‌ معرفی جاهای دیدنی تهران فراخوانی کند. این تابع، اطلاعات لازم را از پایگاه داده استخراج کرده و در قالب یک صفحه‌ وب زیبا به کاربر نمایش می‌دهد. برای درک بهتر، در بخش بعدی بررسی می‌کنیم تنظیمات اولیه جنگو چگونه یک درخواست را پردازش می‌کند.

تنظیمات اولیه URL در جنگو

در این قسمت می خواهیم بررسی کنیم پشت صحنه یک سایت ساخته شده با فریم‌ورک جنگو چه اتفاقی می‌افتد و جنگو چگونه کدهای درستی را برای نمایش هر صفحه اجرا می‌کند. فرض کنید روی دکمه‌ای در سایت کلیک کردید. کلیک شما درخواستی (Request) را به سمت سرور جنگو ارسال می‌کند. حالا جنگو مراحل زیر را طی کرده تا بفهمد کدام قسمت از کدهای شما باید اجرا شود:

 

تنظیمات اولیه URL در جنگو

 

۱. شناسایی آدرس‌ دهی (URL)

جنگو ابتدا مشخص می‌کند که از کدام فایل تنظیمات (URLconf) برای مسیریابی استفاده کند. معمولا این فایل با تنظیم ROOT_URLCONF مشخص شده است. اما در موارد خاص، ممکن است این تنظیم توسط واسط‌های نرم‌افزاری (Middleware) تغییر داده شود.

۲. بارگذاری الگو های آدرس (URL patterns)

جنگو فایل URLconf را بازخوانی کرده و به دنبال متغیری به نام urlpatterns می‌گردد. این متغیر حاوی لیستی از الگوهای آدرس است که با استفاده از توابع django.urls.path یا django.urls.re_path تعریف شدند. این الگوها شبیه نشانی‌هایی هستند که به جنگو می‌گوید هر بخش از آدرس سایت (URL) با کدام کد مرتبط است.

۳. جستجو برای تطابق

جنگو به ترتیب تک‌تک الگوهای آدرس را بررسی می‌کند و دنبال اولین الگویی می‌گردد که با آدرس درخواستی شما (بخش path_info در URL) یکی باشد.

۴. نمایش صفحه

هنگامی که الگوی آدرس مطابق پیدا شد، Django تابع نمایش (View) مرتبط با آن الگو را فراخوانی می‌کند. این تابع یک کلاسی در پایتون است که مسئولیت نمایش محتوای صفحه را برعهده دارد. تابع نمایشگر، اطلاعات زیر را به عنوان ورودی دریافت می‌کند:

  • یک نمونه از کلاس HttpRequest که حاوی جزئیات درخواست کاربر است.
  • اگر الگوی آدرس از بخش‌های نامگذاری شده تشکیل شده باشد (مثلا articles/<int:year>/<slug:slug>)، این بخش‌ها به عنوان آرگومان‌های کلیدی به تابع نمایش ارسال می‌شوند.

۵. مدیریت خطا

اگر هیچ الگوی آدرسی با URL درخواستی مطابقت نداشته باشد، یا در طول این فرآیند خطایی رخ دهد، جنگو یک تابع نمایش مخصوص خطا برای نمایش به کاربر فراخوانی می‌کند. 

مثالی برای درک بهتر

در ادامه، با یک مثال ساده، مرحله به مرحله این بخش را بررسی می‌کنیم:

 

from django.urls import path
from . import views
urlpatterns = [
            path('', views.home, name='home'),
]

 

در این مثال:

  • from django.urls import path: این خط کتابخانه urls را از ماژول django.urls فراخوانی می‌کند. این کتابخانه برای تعریف الگوهای URL استفاده می‌شود.
  • from . import views: این خط توابع view (نمایش) تعریف شده در فایل views.py را به فایل جاری وارد می‌کند.
  • urlpatterns = [ … ]: این لیست، الگوهای URL برنامه post را تعریف می‌کند.

در این مثال، فقط یک الگوی URL وجود دارد:

  • path(”, views.home, name=’home’): این الگو با هر آدرسی که با اسلش (/) خالی شروع می‌شود، مطابقت پیدا می‌کند. هنگامی که آدرسی با این الگو مطابق باشد، تابع views.home فراخوانی می‌شود. همچنین، این الگو نامی به خود اختصاص داده است (name=’home’) که برای اشاره به این الگو در جاهای دیگر پروژه مورد استفاده قرار می‌گیرد.

ادغام دیگر ماژول‌های URL در URL اصلی

به صورت ایده‌آل، برای هر برنامه در جنگو، یک ماژول URL مجزا تعریف می‌شود. این ماژول URL باید در ماژول URL اصلی پروژه ادغام شود، به شکل زیر:

 

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
  path('admin/', admin.site.urls),
  path('', include('post.urls')),
]

 

  • from django.contrib import admin: این خط ماژول admin را از Django فراخوانی می‌کند که برای مدیریت و ویرایش داده‌های وب‌سایت استفاده می‌شود.
  • from django.urls import path, include: این خط کتابخانه urls را برای تعریف الگوهای URL و تابع include برای ادغام ماژول‌های URL دیگر، فراخوانی می‌کند.
  • urlpatterns = [ … ]: این لیست، الگوهای URL کل پروژه را تعریف می‌کند.

 اکنون اگر به آدرس http://127.0.0.1:8000/ در مرورگر خود بروید، به صفحه اصلی برنامه post هدایت خواهید شد.

تعریف الگو های URL

فرض کنید یک وبلاگ با آرشیو مقالات بر اساس سال و ماه دارید. چطور می‌خواهید آدرس‌های URL سایتتان را به شکلی کاربرپسند و سازماندهی شده تعریف کنید؟ جنگو با استفاده از الگوهای URL به شما این امکان را می‌دهد. این الگوها به شما کمک می‌کنند تا آدرس‌های URL را به بخش‌های مختلف سایتتان متصل و به‌راحتی آن‌ها را مدیریت کنید. به عبارت ساده‌تر، الگوهای URL مانند نقشه‌ای عمل می‌کنند که بین آدرس‌های قابل مشاهده در مرورگر و کد پشت‌سر صحنه وب‌سایت شما ارتباط برقرار می‌کنند.

برای تعریف الگوهای URL در جنگو، از تابع urlpatterns در فایل urls.py هر اپلیکیشن استفاده می‌کنند. این تابع، لیستی از الگوهای URL را به جنگو ارائه می‌دهد که هر کدام شامل مسیر، view و نام الگو (درصورت دلخواه)  هستند.

در نوشتن کد باید چند نکته را درنظر بگیرید:

  • برای دریافت اطلاعات از URL از علامت < و > استفاده می‌شود.
  • شما می‌توانید نوع اطلاعات دریافتی را با قرار دادن یک مبدل بعد از دو نقطه مشخص کنید. مثلا <int:year> برای دریافت یک عدد صحیح (سال) به کار می‌رود.
  • نیازی به گذاشتن اسلش ابتدای آدرس URL نیست، زیرا همه URLها به‌صورت پیش‌فرض با اسلش شروع می‌شوند.
  • الگوها به‌ترتیب بررسی می‌شوند. پس اگر الگوی کلی‌تری در ابتدای لیست باشد، الگوهای جزئی‌تر برای آدرس‌های خاص در نظر گرفته نمی‌شوند.

لیست پرکاربرد ترین الگو های URL در جنگو

 

الگوی URL        توضیح نمونه URLهای مطابق نمونه URLهای غیرمجاز
^questions/(?P<pk>\d+)/$ این الگو با آدرس‌هایی که حاوی یک کلید اصلی (primary key) عددی هستند، مطابقت پیدا می‌کند. /questions/0/, /questions/123/, /questions/9999/ /questions/-1/, /questions/test-1/, /questions/abcde/
^posts/(?P<slug>[-\w]+)/$ این الگو با آدرس‌هایی که حاوی یک slug هستند تطابق دارد. slug یک رشته کوتاه است که شامل حروف، ارقام، خط تیره و آندرلاین است. /posts/hello-world/, /posts/my_post-10/, /posts/-my-post_/ /posts/hello world/, /posts/hello%20world/, /posts/@hello-world*/
^blog/(?P<slug>[-\w]+)-(?P<pk>\d+)/$ این الگو با آدرس‌هایی که حاوی یک slug و یک کلید اصلی عددی جدا شده با خط تیره هستند مطابقت پیدا می‌کند. /blog/hello-world-123/, /blog/my-post-10/, /blog/new-post-0/ /blog/hello-world/, /blog/123/, /blog/helloworld1/
^profile/(?P<username>[\w.@+-]+)/$ این الگو با آدرس‌هایی که حاوی یک نام کاربری هستند، سازگار است. نام کاربری ممکن است شامل حروف، ارقام، نقطه، زیرخط، علامت مثبت و “@” باشد. /profile/vitorfs/, /profile.user_123/, /profile/admin@mail.com/ /profile/*vitorfs/, /profile/$vitorfs/, /profile/vitor fs/
^articles/(?P<year>[0-9]{4})/$ این الگو با آدرس‌هایی که حاوی یک سال با فرمت چهاررقمی هستند سازگار است. /articles/2023/, /articles/1999/, /articles/9999/ /articles/999/, /articles/2023-01/
^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$ این الگو با آدرس‌هایی که حاوی یک سال با فرمت چهاررقمی و یک ماه با فرمت دورقمی هستند مطابقت پیدا می‌کند. /articles/2023/01/, /articles/2024/12/, /articles/1999/05/ /articles/2023/1/, /articles/2023-anuary/
^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$ این الگو با آدرس‌هایی که حاوی یک سال با فرمت چهاررقمی، یک ماه با فرمت دورقمی و یک روز با فرمت دورقمی هستند تطبیق دارد. /articles/2023/01/01/, /articles/2024/12/31/, /articles/1999/05/23/ /articles/2023/01/, /articles/2023/anuary/23/, /articles/2023-01-01/

 

اجازه دهید با یک مثال این موضوع را بهتر بررسی کنیم.

مثالی برای درک بهتر الگو در جنگو

اکنون می‌خواهیم برای آرشیو مقالات خود الگوهای URL تعریف کنیم. در اینجا مثالی از یک الگوی URL در Django می‌بینید:

 

from django.urls import 
from . import views
urlpatterns = [
    path("articles/2003/", views.special_case_2003),
    path("articles/<int:year>/", views.year_archive),
    path("articles/<int:year>/<int:month>/", views.month_archive),
    path("articles/<int:year>/<int:month>/<slug:slug>/", views.article_detail),
]

 

  • درخواست /articles/2005/03/ با الگوی سوم مطابقت پیدا می‌کند و تابع views.month_archive با آرگومان‌های year=2005 و month=3 فراخوانده می‌شود.
  • آدرس /articles/2003/ با الگوی اول تطابق پیدا می‌کند نه دومی؛ زیرا الگوها به‌ترتیب بررسی می‌شوند. در این حالت تابع views.special_case_2003 فراخوانده می‌شود.
  • آدرس /articles/2003 با هیچ‌کدام از این الگوها مطابقت ندارد، چون هر الگو نیازمند این است که URL با اسلش به‌پایان برسد.
  • آدرس /articles/2003/03/building-a-django-site/ با الگوی آخر مطابقت پیدا می‌کند و تابع views.article_detail با آرگومان‌های year=2003, month=3 و slug=”building-a-django-site” فراخوانده می‌شود.

با استفاده از الگوهای URL در جنگو می‌توانید ساختار منظمی برای آدرس‌های سایت خود ایجاد کنید و به‌راحتی آن‌ها را مدیریت نمایید.

نمایشگر ها (Views) و URLها در جنگو

میان وب‌فریمورک‌های قدرتمندی مثل جنگو، الگویی به نام MVT (مخفف Model-View-Template) وجود دارد که نمایشگرها (View) یکی از ارکان اصلی آن هستند. نمایشگرها توابع پایتونی بوده که با دریافت یک درخواست وب (Web Request)، پاسخ مناسب را برای مرورگر ارسال می‌کنند. این پاسخ شامل محتویات HTML یک صفحه‌ وب، یک آدرس جدید برای هدایت کاربر، خطای ۴۰۴، سند XML، تصویر، یا هر چیزی است که مرورگر بتواند آن را نمایش دهد.

به بیان ساده‌تر، نمایشگرهای جنگو بخش مهمی از رابط کاربری هستند. آن‌ها معمولا محتویات HTML، CSS و جاوااسکریپت موجود در فایل‌های قالب (Template) را پردازش کرده و به شکلی تبدیل می‌کنند که شما موقع باز کردن یک صفحه وب در مرورگر می‌بینید.

 

نمایشگرها (Views) و URLها در جنگو

 

عبور پارامترها در URL جنگو

برای آدرس دهی در جنگو می‌توانید از پارامترها برای انتقال اطلاعات به viewها (نمایش‌ها) استفاده کنید. این کار به شما امکان می‌دهد تا عملکرد viewها را براساس داده‌های خاص تنظیم کنید. دو نوع اصلی پارامتر وجود دارد:

۱. پارامتر های موقعیت

این پارامترها در بخش‌های خاصی از URL در جنگو قرار می‌گیرند و با اسلش (/) از هم جدا می‌شوند. برای مثال، در URL زیر:

 

/articles/123/

 

عدد ۱۲۳ یک پارامتر موقعیت است که به عنوان ID مقاله استفاده می‌شود.

برای تعریف پارامترهای موقعیت در الگوهای URL، از الگوی path() به همراه مبدل‌های مسیر (path converters) استفاده کنید. مبدل‌های مسیر نوع داده پارامتر را مشخص می‌کنند. برای مثال، مبدل int: نشان می‌دهد که پارامتر باید یک عدد صحیح باشد.

 

from django.urls import path
urlpatterns = [
    path('articles/<int:article_id>/', views.article_detail),
]

 

در این مثال، article_id یک پارامتر موقعیت با مبدل int: است که به view article_detail منتقل می‌شود.

۲. پارامتر های کلید واژه‌ ای

این پارامترها به‌صورت جفت کلید-مقدار در URL مشخص می‌شوند و با علامت سوال (?) و علامت مساوی (=) از هم جدا می‌شوند. برای مثال، در URL زیر:

 

/articles/?category=technology&author=john_doe

 

دو پارامتر کلیدواژه‌ای وجود دارد:

  • category=technology
  • author=john_doe

برای تعریف پارامترهای کلیدواژه‌ای در الگوهای URL، از الگوی path() به همراه علامت سوال (?) و نام پارامترها استفاده کنید.

 

from django.urls import path
urlpatterns = [
    path('articles/', views.article_list, name='article_list'),
    path('articles/?category=<str:category>&author=<str:author>', views.article_list, name='article_list_filtered'),
]

 

چند نکته برای استفاده از پارامترها 

  • برای استفاده از پارامترهای موقعیتی، باید از الگوهای URL با مبدل‌های مسیر مناسب استفاده کنید. برای مثال، در پارامترهای عددی، می‌توانید از int:parameter_name استفاده کنید.
  • برای استفاده از پارامترهای کلیدواژه‌ای، می‌توانید از الگوهای URL با مبدل‌های مسیر str:parameter_name یا path:parameter_name استفاده کنید.
  • پارامترهای کلیدواژه‌ای به‌طور پیش‌فرض اختیاری هستند. برای الزامی کردن آن‌ها، می‌توانید از الگوهای URL با علامت ?P استفاده کنید.

هدایت‌ ها و بازنویسی‌ ها (Redirects and Rewrites) در جنگو

هدایت‌ها و بازنویسی‌ها در آدرس دهی در جنگو دو روش مهم برای مدیریت نحوه نمایش URLهای جنگو است. هر دو می‌توانند برای تغییر مسیری که کاربران هنگام درخواست URL خاص به آن هدایت می‌شوند، استفاده شوند، اما متفاوت عمل می‌کنند.

هدایت‌ ها (Redirects) برای آدرس دهی در جنگو

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

  • انتقال کاربران از یک URL قدیمی به یک URL جدید: اگر URL وب‌سایت خود را تغییر دادید، شما می‌توانید از ریدایرکت برای هدایت خودکار کاربران از URL قدیمی به URL جدید استفاده کنید. این کار به حفظ رتبه سایت شما در موتورهای جستجو کمک می‌کند.
  • جلوگیری از دسترسی کاربران به محتوای حذف شده: اگر محتوایی را از وب‌سایت خود حذف کردید، از ریدایرکت برای هدایت کاربران به صفحه دیگری، مانند صفحه اصلی، می‌توانید استفاده کنید.

 

در جنگو می‌توانید از تابع redirect() برای ایجاد هدایت استفاده کنید. این تابع یک آبجکت HttpResponseRedirect را برمی‌گرداند.

 

from django.shortcuts import redirect
def my_view(request):
    # ...
    return redirect('/new-url/')

 

می‌توانید با استفاده از آرگومان permanent نوع هدایت را تعیین کنید. اگر این آرگومان را به True تنظیم کنید، یک هدایت دائمی (۳۰۱) ایجاد می‌شود که به موتورهای جستجو می‌گوید URL قدیمی دیگر معتبر نیست. اگر آن را به False تنظیم کنید، یک هدایت موقت (۳۰۲) ایجاد می‌شود که به موتورهای جستجو می‌گوید URL قدیمی ممکن است در آینده دوباره معتبر شود.

 

from django.shortcuts import redirect
def my_view(request):
    # ...
    return redirect('/new-url/', permanent=True)

 

بازنویسی‌ ها (Rewrites) برای آدرس دهی در جنگو

بازنویسی‌ها زمانی استفاده می‌شوند که شما می‌خواهید URL را بدون تغییر دادن URL واقعی که کاربر درخواست می‌کند، تغییر دهید. این کار معمولا برای موارد زیر انجام می‌شود:

  • پنهان کردن شناسه‌های پایگاه داده از URLها: URL در جنگو به‌طور پیش‌فرض شامل شناسه‌های پایگاه داده برای آبجکت‌های مدل هستند. این شناسه‌ها می‌توانند ناخوشایند و غیرقابل خواندن باشند. شما می‌توانید از بازنویسی‌ برای پنهان کردن این شناسه‌ها و استفاده از URLهای کاربرپسندتر استفاده کنید.
  • اضافه کردن پیشوند زبان به URLها: اگر وب‌سایت شما از چندین زبان پشتیبانی می‌کند، از بازنویسی‌ها می‌توانید برای اضافه کردن پیشوند زبان به URLها استفاده کنید.

در جنگو می‌توانید از کلاس RegexURLPattern برای ایجاد بازنویسی استفاده کنید. این کلاس به شما امکان می‌دهد یک الگوی regex را تعریف کنید که با URLهای ورودی مطابقت داشته باشد و یک تابع را مشخص کنید که باید هنگام تطبیق الگو اجرا شود.

 

from django.urls import path, re_path
urlpatterns = [
    # ...
    re_path(r'^product/(?P<product_id>\d+)/$', 'my_view', name='product_detail'),
]

 

در این مثال، URL ‘/product/123/’ با الگوی regex r’^product/(?P<product_id>\d+)/$’ مطابقت دارد. این الگو گروهی به نام product_id را تعریف می‌کند که شناسه محصول را ذخیره می‌کند. تابع my_view با شناسه محصول به عنوان آرگومان فراخوانده می‌شود. همچنین می‌توانید از آرگومان name برای نام‌گذاری الگوی URL استفاده کنید. این نام می‌تواند برای ایجاد URLهای معکوس در قالب‌های Django استفاده شود.

 

from django.urls import path, re_path
urlpatterns = [
    # ...
    re_path(r'^product/(?P<product_id>\d+)/$', 'my_view', name='product_detail'),
]
def my_other_view(request):
    # ...
    product_url = reverse('product_detail', args=[123])

 

در این مثال، reverse(‘product_detail’, args=[123]) URL ‘/product/123/’ را برمی‌گرداند.

معکوس کردن URL ها (URL Reversing)

در دنیای جنگو، یکی از نیازهای همیشگی که با آن دست‌وپنجه نرم می‌کنید، مدیریت بهینه آدرس‌های اینترنتی یا همان URLهایی است که در لینک‌دهی به صفحات در بخش کاربر و سرور به‌کار می‌برید. 

چالشی که وجود دارد، آدرس‌‌هایی به‌صورت Hardcode است که وارد کردن آن‌ها به‌طور دستی کار سخت و پرخطایی است. ازطرفی، اگر بخواهیم آدرس‌ها را با ساختار اصلی‌شان مطابق با URLconf به‌کار ببریم، با هر تغییر باید کل کد پروژه را زیرورو کنیم. 

اینجاست که طبق اصل DRY (مخفف Done Repeat Yourself) به روشی نیاز داریم که بدون دستکاری دسته‌جمعی بتوانیم ساختار URL در جنگو را آپدیت کنیم. اطلاعات کلیدی برای دستیابی به یک آدرس، شناسه نمایشگر، نوع پارامتر (موقعیتی یا کلیدی) و مقدار آرگومان‌هایی هستند که به view ارسال می‌شوند. باتوجه به این اطلاعات، خبر خوب این است که جنگو راهکاری برای این موضوع دارد. 

تنظیمات آدرس (URLconf) تنها مرجع معتبر برای تعریف ساختار آدرس‌هاست. این تنظیمات را در اختیار جنگو قرار می‌دهیم و از آن می‌توانیم در دو جهت استفاده کنیم:

  • از آدرس درخواستی کاربر به نمایشگر (view) مناسب برسیم

با دریافت آدرس درخواستی از کاربر، جنگو، نمایشگر (view) صحیح را فراخوانی می‌کند و آرگومان‌های لازم را با مقادیر استخراج‌شده از آدرس، به آن می‌فرستد.

  • از شناسه‌ نمایشگر (view) و مقادیر آرگومان‌ها، آدرس مرتبط را به دست بیاوریم

با داشتن نام نمایشگر (view) و مقادیر آرگومان‌هایی که به آن ارسال می‌شود، آدرس اینترنتی مرتبط را به‌دست آوریم.

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

  • در قالب‌های HTML: با استفاده از تگ قالب url
  • در کد پایتون: با استفاده از تابع reverse()
  • در کد مربوط به مدیریت آدرس‌های اشیاء مدل (Model): با استفاده از متد get_absolute_url()

مثالی از معکوس کردن URL در جنگو

فرض کنید قصد داریم آرشیو مقالات وبلاگ خود را بر اساس سال دسته‌بندی کنیم. در این مثال، نحوه تنظیم آدرس‌های این آرشیوها در جنگو را بررسی می‌کنیم.

در کد، با استفاده از path یک آدرس جدید تعریف می‌کنیم. این آدرس به‌صورت articles/year (با جایگذاری سال مورد نظر) خواهد بود. مثلا برای آرشیو سال ۲۰۱۲، آدرس به شکل articles/2012/ درمی‌آید. اکنون چند روش برای استفاده از این آدرس در قالب (template) و کد پایتون دراختیار داریم:

  • برای استفاده آدرس در قالب می‌توانیم با استفاده از تگ {% url %} و نام آدرس (news-year-archive) به همراه سال موردنظر، یک لینک بسازیم. مثلا:

 

<a href="{% url 'news-year-archive' 2012 %}">آرشیو ۲۰۱۲</a>

 

  • همچنین می‌توانیم از یک متغیر در قالب برای سال استفاده کنیم:

 

<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">آرشیو {{ yearvar }}</a></li>
{% endfor %}
</ul>

 

  • ازطرفی، با استفاده از توابع reverse و HttpResponseRedirect می‌توانیم کاربر را به آرشیو سال خاصی هدایت کنیم. مثلا:

 

from django.http import HttpResponseRedirect
from django.urls import reverse
def redirect_to_year(request):
    # ...
    Year = 2006
    # ...
    return HttpResponseRedirect(reverse("news-year-archive", args=(year,)))

 

نکته‌ مهم اینجاست که اگر بخواهید بعدا ساختار آدرس را عوض کنید، فقط کافی‌است این بخش از کد URLconf را تغییر دهید. با این حال، در بعضی موارد که از یک view برای نمایش محتوا با الگوهای مختلف استفاده می‌شود، ممکن است نام URL به‌تنهایی برای معکوس‌سازی URL کافی نباشد. در بخش بعدی، راهکار اصولی جنگو را برای این مشکل بررسی می‌کنیم.

اصولی برای نامگذاری الگو های URL در جنگو

برای اینکه بتوانید آدرس‌های URL را به‌راحتی معکوس کنید (یعنی با دانستن اسم آن‌ها، آدرس کامل را به‌دست آورید)، لازم است از الگوی آدرس‌دهی با نام استفاده کنید. مانند مثال‌هایی که در بخش قبلی مقاله بررسی کردیم. برای نامگذاری این الگوها می‌توانید از هر کاراکتری که دوست دارید، استفاده کنید. یعنی محدود به اسم‌های استاندارد پایتون نیستید.

البته موقع انتخاب اسم، بهتر است اسامی را انتخاب کنید که با نام‌ برنامه‌های دیگر تداخل نداشته باشد. برای مثال، اگر شما یک الگو به اسم (comment) درست کنید و برنامه دیگری نیز همین اسم را انتخاب کرده باشد، آدرسی که تابع reverse پیدا می‌کند بستگی به این دارد که کدام یک آخرین الگوی لیست url patterns پروژه شما است. برای اینکه احتمال تداخل بین الگوهای URL در برنامه‌های مختلف جنگو کم‌تر شود، سه روش پیش‌رو داریم:

۱. استفاده از پیشوند

به جای استفاده از اسم‌های ساده مثل «comment» برای الگوهای URL در جنگو از پیشوند به همراه اسم الگو استفاده کنید. مثل «myapp-comment» که «myapp» اسم برنامه شما و «comment» اسم الگوی URL است. این کار باعث می‌شود که الگوهای URL برنامه‌های مختلف با هم تداخل نداشته باشند، حتی اگر اسم‌های مشابهی داشته باشند.

۲. جایگزینی View

اگر می‌خواهید View یک برنامه دیگر را با View سفارشی خودتان جایگزین کنید، از همان اسم الگوی URL آن برنامه می‌توانید استفاده کنید. مثلا می‌خواهید View پیش‌فرض ورود به سیستم جنگو (LoginView) را با View سفارشی خودتان جایگزین کنید.

برای اینکه این کار به‌درستی انجام شود، باید View سفارشی شما بعد از View پیش‌فرض جنگو در لیست الگوهای URL پروژه شما قرار داده شود.

۳. استفاده از نام الگوی مشابه برای چند الگو

حتی می‌توانید برای چند الگو با آدرس مختلف از یک اسم استفاده کنید، به شرطی که در آرگومان‌ها با هم متفاوت باشند. علاوه‌بر اسم الگو، تابع reverse، تعداد آرگومان‌ها و اسم آرگومان‌های کلیدی را نیز برای تطبیق در نظر می‌گیرد. به عنوان مثال، می‌توانید دو الگوی URL با نام detail داشته باشید، یکی برای جزئیات یک محصول و دیگری برای جزئیات یک سفارش.

کار با فضای نام (Namespaces) در URLها

Namespace یا «فضای نام» به شما کمک می‌کند تا الگوهای آدرس‌دهی که اسم‌شان را مشخص کردید، به شکل منحصربه‌فردی پیدا کنید؛ حتی اگر برنامه‌های مختلف از اسامی مشابه برای آدرس‌ها استفاده کرده باشند. این قابلیت برای برنامه‌های جانبی که از جاهای دیگر نصب می‌کنید، اهمیت ویژه‌ای دارد. 

فرض کنید قصد دارید یک برنامه را در چند جای مختلف از سایتتان می‌خواهید راه‌اندازی کنید. Namespace به شما کمک می‌کند تا آدرس‌های URL این برنامه‌های مشابه را از هم تشخیص دهید. Namespace از دو بخش تشکیل شده که هر دو بخش به‌صورت رشته‌ای هستند:

فضای‌ نام برنامه (application namespace)

این اسم، برنامه‌ای را مشخص می‌کند که راه‌اندازی می‌شود. تمام نمونه‌های یک برنامه‌ خاص، فضای‌ نام مشترک دارند.

فضای‌نام نمونه (instance namespace)

این بخش، نمونه‌ خاص از یک برنامه را مشخص می‌کند. فضای‌ نام نمونه باید در تمام پروژه شما منحصربه‌فرد باشد. البته ممکن است با فضای‌ نام برنامه هم یکی باشد. این مورد برای تعیین نمونه‌ پیش‌فرض برنامه استفاده می‌شود. برای مثال، نمونه‌ پیش‌فرض برنامه‌ مدیریت جنگو یک فضای‌ نام نمونه به اسم «admin» دارد.

برای استفاده از Namespace در آدرس‌ دهی جنگو از علامت «:» (دو نقطه) استفاده می‌شود. برای مثال، صفحه‌ اصلی برنامه‌ مدیریت با عبارت «admin:index» فضای‌نام «admin» و آدرس با اسم «index» را مشخص می‌کند.

فضاهای‌ نام‌ ممکن است تودرتو هم قرار بگیرند. مثلا آدرس «sports:polls:index» به دنبال آدرسی با اسم «index» در فضای‌نام «polls» می‌گردد که خودش هم درون فضای‌ نام بالارده‌ «sports» تعریف شده است.

اشکال‌ زدایی و تست الگوهای URL

اشکال‌زدایی و تست الگوهای URL در جنگو برای اطمینان از عملکرد صحیح برنامه وب شما ضروری است. در این راهنما، به چند روش مختلف برای اشکال‌زدایی و تست الگوهای URL جنگو می‌پردازیم.

  1. استفاده از ابزار django-extensions

یکی از محبوب‌ترین ابزارها برای اشکال‌زدایی الگوهای URL جنگو، ابزار django-extensions است. این ابزار دستوری به نام urlpattern_tree را ارائه می‌دهد که لیستی از تمام الگوهای URL تعریف‌شده در پروژه شما را به‌همراه اطلاعاتی در مورد هر الگو، مانند نام الگو، مسیر URL و تابع نمایش مربوطه، نمایش می‌دهد.

برای استفاده از دستور urlpattern_tree، ابتدا باید django-extensions را نصب کنید. این کار را می‌توانید با اجرای دستور زیر در ترمینال انجام دهید:

 

pip install django-extensions

 

پس از نصب django-extensions، می‌توانید از دستور urlpattern_tree برای نمایش لیستی از تمام الگوهای URL تعریف‌شده در پروژه خود استفاده کنید. به عنوان مثال، برای نمایش تمام الگوهای URL در برنامه اصلی خود، دستور زیر را اجرا کنید:

 

python manage.py urlpattern_tree

 

این دستور لیستی از تمام الگوهای URL تعریف‌شده در urls.py برنامه اصلی شما را نمایش می‌دهد.

۲. استفاده از breakpoint()

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

برای استفاده از breakpoint در الگوی آدرس دهی در جنگو، ابتدا باید تابع نمایش مربوط به الگو را پیدا کنید. سپس می‌توانید در هر جایی از تابع نمایش که می‌خواهید اجرای برنامه متوقف شود، یک breakpoint اضافه کنید. به عنوان مثال، کد زیر یک breakpoint به تابع نمایش برای الگوی URL /articles/(?P<pk>\d+)/ اضافه می‌کند:

 

def article_detail(request, pk):
    # ...
    # Add a breakpoint here
    breakpoint()
    # …

 

پس از اضافه کردن breakpoint می‌توانید برنامه خود را با اجرای دستور python manage.py runserver اجرا کنید. هنگامی که برنامه به breakpoint رسید، اجرای برنامه متوقف می‌شود و می‌توانید متغیرها و عبارات را در آن نقطه بررسی کنید.

۳. استفاده از تست‌ های واحد

بهترین روش برای تست الگوهای URL در جنگو، استفاده از تست‌های واحد است. تست‌های واحد به شما امکان می‌دهند تا کد خود را به‌صورت جداگانه تست کنید و مطمئن شوید که به‌درستی کار می‌کند. برای تست الگوهای URL جنگو، می‌توانید از کتابخانه تست داخلی جنگو به نام django.test استفاده کنید. کتابخانه django.test کلاس‌هایی را ارائه می‌دهد که از آن‌ها می‌توانید برای تست الگوهای URL، نمایش‌ها و سایر اجزای برنامه خود استفاده کنید.

به عنوان مثال، کد زیر یک تست واحد ساده برای الگوی URL /articles/(?P<pk>\d+)/ نشان می‌دهد:

(اگر نمی‌دانید این الگو از کجا آمده، پیشنهاد می‌کنیم دوباره نگاهی به بخش تعریف الگو در مقاله بیندازید.)

 

from django.test import TestCase
from .views import article_detail
class ArticleDetailViewTest(TestCase):
    def test_article_detail_view(self):
        # Create a fake article object
        article = Article.objects.create(title="My Article", body="This is my article.")
        # Reverse the URL for the article detail view
        url = reverse('article_detail', kwargs={'pk': article.pk})
        # Send a GET request to the URL
        response = self.client.get(url)
        # Check that the response is successful
        self.assertEqual(response.status_code, 200)
        # Check that the article content is in the response
        self.assertContains(response, article.title)
        self.assertContains(response, article.body)

 

این تست یک مقاله جعلی ایجاد می‌کند، URL را برای نمای جزئیات مقاله معکوس می‌کند، یک درخواست GET به URL ارسال کرده و پاسخ را بررسی می‌کند تا مطمئن شود عملیات موفقیت آمیز است.

سخن‌ پایانی؛ راه‌وچاه آدرس دهی در جنگو

آدرس دهی در جنگو یک سیستم قدرتمند و انعطاف‌پذیر برای تعریف URLها و مرتبط کردن آن‌ها با توابع View است. در این مقاله، به‌طور مفصل به مبحث URL در جنگو پرداختیم و موارد زیر را بررسی کردیم.

  • نمایش: توابعی که محتوای صفحات وب را تولید می‌کنند.
  • معکوس کردن URL: روشی برای تبدیل نام الگوی URL به URL واقعی است.
  • الگوهای URL: قوانینی که به جنگو می‌گوید چگونه URL ها را به نمایش بگذارد.
  • فایل‌های urls.py: محلی برای تعریف الگوهای URL برای برنامه‌های جنگو شما هستند.
  • URLها: آدرسوهایی که کاربران برای دسترسی به صفحات مختلف وب سایت شما استفاده می‌کنند.
  • توابع کمکی URL: توابعی که وظایف مختلفی مانند ساختن URLهای مطلق و تست URL انجام می‌دهند.

با درک مفاهیم کلیدی مانند موارد بالا، می‌توانید URLهای پیچیده برای برنامه‌های وب خود ایجاد کنید. 

چه رتبه ای می‌دهید؟

میانگین ۰ / ۵. از مجموع ۰

اولین نفر باش

title sign
معرفی نویسنده
تیم فنی نیک آموز
مقالات
396 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
تیم فنی نیک آموز
title sign
دیدگاه کاربران

close-image