در جنگو، مسیردهی URL یکی از اجزای اصلی است که به شما این امکان را میدهد تا درخواستها را به ویوها متصل کنید. جنگو از یک سیستم مسیردهی قدرتمند استفاده میکند که به شما اجازه میدهد تا مسیرهای URL را به ویوهای مختلف و متناسب با نیازهای پروژهی خود نگاشت کنید.
۱. مسیردهی URL در جنگو
برای تعریف مسیرهای URL در جنگو از فایل urls.py استفاده میکنیم. در این فایل، مسیرهای مختلف URL به ویوهای مربوطه متصل میشوند.
ساختار پایهی فایل urls.py:
در هر اپلیکیشن جنگو، یک فایل urls.py وجود دارد که باید مسیرها را در آن تعریف کنید. همچنین در سطح پروژه، یک فایل urls.py برای مسیردهی کلی پروژه وجود دارد.
-
فایل urls.py در اپلیکیشن: این فایل مسئول تعریف مسیرهای خاص اپلیکیشن است.
# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('home/', views.home_view, name='home'),
path('about/', views.about_view, name='about'),
] -
فایل urls.py در سطح پروژه: این فایل معمولاً در دایرکتوری اصلی پروژه قرار دارد و شامل ارجاع به مسیرهای مختلف اپلیکیشنها است.
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include('myapp.urls')), # ارجاع به URLهای اپلیکیشن myapp
]
در اینجا:
- include() برای ارجاع به فایل urls.py در داخل اپلیکیشنها استفاده میشود.
- path() مسیر URL را به ویو مربوطه متصل میکند.
۲. روشهای مسیردهی URL
در جنگو، میتوان از چند روش مختلف برای مسیردهی URL استفاده کرد:
۱.1. مسیرهای ساده
سادهترین نوع مسیردهی در جنگو استفاده از مسیرهای استاتیک است. در این حالت، شما مسیرهایی را مشخص میکنید که به ویوهای خاص هدایت میکنند.
مثال:
from django.urls import path
from . import views
urlpatterns = [
path('home/', views.home_view, name='home'),
path('about/', views.about_view, name='about'),
]
در اینجا:
- مسیر home/ به ویو home_view و مسیر about/ به ویو about_view ارجاع داده میشود.
2.1. مسیردهی با متغیرها
گاهی اوقات ممکن است بخواهید از متغیرها در URL استفاده کنید. جنگو این امکان را فراهم کرده است که مقادیر دینامیک از URL دریافت کرده و آنها را به ویو منتقل کنید.
مثال:
from django.urls import path
from . import views
urlpatterns = [
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
]
در اینجا:
- <int:post_id> به این معناست که مقداری از نوع عدد صحیح به نام post_id از URL گرفته شده و به ویو ارسال میشود.
- برای مثال، وقتی کاربر به آدرس http://127.0.0.1:8000/post/5/ وارد شود، مقدار 5 به ویو post_detail ارسال میشود.
3.1. مسیردهی با انواع مختلف دادهها
در جنگو میتوان از انواع مختلف دادهها برای تعریف متغیرهای دینامیک در URL استفاده کرد.
- int:: برای دریافت اعداد صحیح.
- str:: برای دریافت رشته.
- slug:: برای دریافت slug (معمولاً برای URLهای SEO-friendly).
- uuid:: برای دریافت شناسههای UUID.
مثال:
from django.urls import path
from . import views
urlpatterns = [
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
path('author/<slug:author_slug>/', views.author_posts, name='author_posts'),
]
4.1. مسیردهی با استفاده از Regular Expressions (regex)
در برخی مواقع ممکن است نیاز به استفاده از الگوهای پیچیدهتری برای مسیردهی URL داشته باشید. جنگو به شما این امکان را میدهد که از regular expressions برای تعریف مسیرهای URL استفاده کنید.
مثال:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^post/(?P<post_id>\d+)/$', views.post_detail, name='post_detail'),
]
در اینجا از re_path() برای استفاده از یک الگوی regular expression استفاده شده است که مشابه روش path() عمل میکند، اما انعطافپذیری بیشتری دارد.
۳. مسیردهی معکوس (Reverse URL Lookup)
گاهی اوقات ممکن است نیاز داشته باشید که به جای استفاده از URLهای سختکد شده در کد خود، از نام مسیرها استفاده کنید. این امکان را میتوانید با استفاده از Reverse URL Lookup در جنگو انجام دهید.
استفاده از reverse():
# بدست آوردن URL برای یک نام خاص
url = reverse('post_detail', args=[5])
print(url) # خروجی: /post/5/
در اینجا:
- reverse() به شما کمک میکند که با استفاده از نام مسیر، URL مربوطه را به دست آورید.
- args=[5] به این معناست که مقدار متغیر post_id را به ویو ارسال میکنیم.
استفاده از {% url %} در قالبها:
در قالبها نیز میتوانید از تگ {% url %} برای تولید URLها استفاده کنید.
مثال:
در اینجا:
- تگ {% url %} به جنگو دستور میدهد که URL مربوط به ویو post_detail را با استفاده از پارامتر post_id=5 تولید کند.
۴. مسیردهی نامگذاری شده
برای بهبود نگهداری کد و جلوگیری از اشتباهات در URLها، میتوان از نامگذاری مسیرها استفاده کرد. این کار به شما کمک میکند که در هر زمان نیاز به تغییر مسیر URL داشته باشید، فقط باید نام مسیر را تغییر دهید و در بقیه قسمتهای پروژه نیازی به تغییر URLها نخواهید داشت.
مثال از مسیردهی نامگذاری شده:
from django.urls import path
from . import views
urlpatterns = [
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
]
در اینجا، مسیر post_detail نامگذاری شده است و در هر جا که به این مسیر ارجاع داده شود، میتوان از نام post_detail استفاده کرد.
نتیجهگیری
- در جنگو، فایل urls.py برای مسیردهی درخواستها به ویوهای مختلف استفاده میشود.
- میتوانید از مسیرهای ساده، مسیرهای با متغیرهای دینامیک، و regular expressions برای ایجاد مسیرهای پیچیدهتر استفاده کنید.
- جنگو امکان Reverse URL Lookup را برای تولید URLها به صورت معکوس فراهم میکند که باعث افزایش انعطافپذیری و خوانایی کد میشود.
- با استفاده از نامگذاری مسیرها، میتوانید به راحتی از تغییرات در URLها جلوگیری کنید و کد خود را مدیریت کنید.
