آنچه در این مبحث می خوانید
در جنگو، یکی از مفاهیم حیاتی که نقش مستقیم در نمایش صفحات وب ایفا میکند، مفهوم URL Routing یا URL Configuration است؛ یعنی همان سیستمی که درخواستهای کاربران را به توابع یا ویوهای خاص هدایت میکند. در این مقاله بهصورت جامع بررسی میکنیم که Root URLConf چیست، چطور با urlpatterns کار کنیم، متدهای path و re_path چه تفاوتی با هم دارند، نحوهی تعریف view function چگونه است، و در نهایت با مفهوم HttpResponse عمیقتر آشنا میشویم.
Root URLConf چیست؟
در هر پروژهی Django، هنگامی که کاربر یک URL را در مرورگر وارد میکند، سیستم مسیریابی جنگو تلاش میکند تا این مسیر را با یکی از مسیرهایی که در فایل تنظیمات (configuration) پروژه تعریف شده مطابقت بدهد.
فایل اصلی که این تطبیق را آغاز میکند معمولاً urls.py در پوشهی پروژهی اصلی (همنام با پروژه) است. این فایل همان Root URLConf نام دارد، چون نقطهی شروع تمام مسیرهای URL پروژه است.
به عبارت سادهتر:
Root URLConf اولین جایی است که Django برای یافتن مسیر (URL) به سراغ آن میرود.
این فایل معمولاً به صورت زیر است:
# file: myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')), # ارجاع به فایل urls اپلیکیشن myapp
]
در اینجا:
- مسیر
admin/برای مدیریت Django تعریف شده است. - مسیر خالی (
'') به فایلurls.pyدر اپmyappارجاع میدهد.این یعنی اگر کاربر به آدرس اصلی سایت برود (/)، Django به دنبال مسیر درونmyapp/urls.pyخواهد گشت.
بنابراین میتوان گفت:
- Root URLConf نقشهی اصلی پروژه است.
- مسیرهای دیگر (در اپلیکیشنها) زیرمجموعهی آن هستند.
- با استفاده از
include()میتوان ساختار پروژه را ماژولار و سازمانیافته نگه داشت.
url patterns چیست؟
درون هر فایل urls.py، چه Root باشد و چه برای یک اپلیکیشن خاص، لیستی به نام urlpatterns قرار دارد.
این لیست، مجموعهای از مسیرها (path یا re_path) است که هرکدام به یک view (چه تابع و چه کلاس) متصل شدهاند.
نمونهی ساده از urlpatterns:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home), # آدرس اصلی سایت
path('about/', views.about), # صفحهی درباره ما
path('contact/', views.contact),
]
در این قطعهکد:
urlpatternsیک لیست پایتونی است.- هر
path()مشخص میکند اگر کاربر به URL خاصی رفت، کدام تابع یا view فراخوانی شود.
کارکرد urlpatterns مانند “نقشهی راه” سایت است. مثلاً:
/→ تابعhome/about/→ تابعabout/contact/→ تابعcontact
Django بهترتیب این مسیرها را بررسی میکند. اولین موردی که با URL کاربر مطابقت داشته باشد اجرا میشود.
نکتهی مهم:
اگر هیچ مسیری مطابقت نداشت، Django خطای 404 Not Found نمایش خواهد داد.
متد path و re_path چیست و چه تفاوتی دارند؟
در Django برای تعریف مسیرها در urlpatterns دو روش اصلی وجود دارد:
path() و re_path().
۱. متد path()
این متد سادهترین و پرکاربردترین روش برای تعریف آدرسهاست.
در نسخههای جدید Django (از 2.0 به بعد)، path جایگزین متد قدیمیتری به نام url() شده است.
مثال:
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list),
path('articles//', views.article_detail),
]
در اینجا:
- مسیر اول، آدرس
/articles/را بهarticle_listمتصل میکند. - مسیر دوم دارای پارامتر است:
<int:id>به معنی آن است که اگر URL شامل عددی بود، آن عدد به صورت پارامترidبه تابعarticle_detailارسال میشود.
مثلاً:
/articles/5/→views.article_detail(request, id=5)
ویژگیهای
path():- ساختار ساده و خوانا دارد.
- نیازی به عبارات باقاعده (Regular Expressions) ندارد.
- مناسب برای بیشتر پروژههاست.
۲. متد
re_path()در مواردی که URLها پیچیدهتر باشند و لازم باشد از عبارات باقاعده (Regex) استفاده کنیم، از
re_path()سود میبریم.مثال:
- مسیر اول، آدرس
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^articles/(?P[0-9]{4})/$', views.year_archive),
]
در اینجا:
r'^articles/(?P<year>[0-9]{4})/$'یک عبارت باقاعده است.- فقط سالهایی با ۴ رقم (مثلاً 2022) را میپذیرد.
- مقدار گرفتهشده در متغیر
yearبه تابعyear_archiveارسال میشود.
ویژگیهای re_path():
- انعطافپذیری بالا به کمک Regex.
- مناسب برای پروژههایی که ساختار URL خاص یا محدود دارند.
- نسبت به
path()کمی پیچیدهتر است.
🔹 تفاوت اصلی
| ویژگی | path() | re_path() |
|---|---|---|
| سادگی | بسیار ساده و خوانا | نیازمند regex |
| کاربرد | معمولی یا پارامتردار ساده | مسیرهای پیچیده با الگوی خاص |
| نسخه معرفی | Django 2.0 | از Django 2.0 به بعد جایگزین url() |
در مجموع، در ۹۰٪ پروژهها path() کافی و بهتر است و تنها در شرایط خاص باید به سراغ re_path() رفت.
تعریف تابع function
در Django هر آدرس به یک تابع (function) یا کلاس (class-based view) متصل میشود. اگر با حالت ساده و فانکشنال شروع کنیم، باید یک تابع تعریف کنیم که ورودی آن request باشد و در نهایت پاسخی (Response) بازگرداند.
مثلاً:
from django.http import HttpResponse
def about(request):
return HttpResponse("درباره ما
")
در اینجا تابع about یک تابع سادهی پایتون است که:
- ورودیاش یک شیء از نوع
HttpRequestبه نامrequestاست. - خروجیاش باید یک شیء از نوع
HttpResponseباشد.
در urlpatterns میتوان این تابع را متصل کرد:
urlpatterns = [
path('about/', about),
]
با رفتن به آدرس /about/ خروجی تابع در مرورگر نمایش داده میشود.
آموزش تابع def (request)
زمانی که کاربر صفحهای را در سایت باز میکند، جنگو درخواست HTTP ارسال شده را دریافت میکند و در قالب شیءای به نام request به تابع view شما میدهد.
ساختار تابع view معمولاً به صورت زیر است:
def view_name(request):
# پردازش درخواست
return HttpResponse("پاسخ به کاربر")
پارامتر request یک شیء غنی از نوع HttpRequest است که دارای اطلاعات مهمی دربارهی کاربر و درخواست اوست، مثل:
- روش درخواست (
request.method): معمولاً GET یا POST - دادههای فرم ارسالشده (
request.POST) - کوئریها (پارامترهای GET در URL) با
request.GET - اطلاعات کوکیها (
request.COOKIES) - IP کاربر، مسیر URL، هِدرها و غیره.
مثلاً برای بررسی نوع درخواست:
def contact(request):
if request.method == "POST":
name = request.POST.get("name")
return HttpResponse(f"سلام {name}")
return HttpResponse("فرم تماس")
HttpResponse چیست؟
در وب، هر درخواست HTTP باید پاسخی مطابق پروتکل HTTP برگرداند.
در Django این پاسخ با استفاده از کلاس HttpResponse ساخته میشود.
HttpResponseشیئی است که محتوای نهایی (مثل HTML، JSON، متن خام و …) را به کاربر بازمیگرداند.
نمونه ساده:
from django.http import HttpResponse
def hello(request):
return HttpResponse("hello world!")
در این مثال مرورگر کاربر جملهی hello world! را مستقیماً از سرور دریافت و نمایش میدهد.
کلاس HttpResponse ویژگیهای متعددی دارد:
content: محتوای پاسخstatus_code: کد وضعیت مثل 200، 404، 500 و غیرهheaders: برای تنظیم هدرهای سفارشی پاسخ
مثال پیشرفتهتر:
def custom_response(request):
response = HttpResponse("محتوای سفارشی", content_type="text/html")
response.status_code = 200
response['X-Custom-Header'] = 'TestValue'
return response
جمعبندی
در این مقاله یاد گرفتیم که در Django:
- Root URLConf نقطهی شروع تمام مسیرهاست.
- لیست
urlpatternsمسیرها را به ویوها متصل میکند. - دو متد مهم برای تعریف URL وجود دارد:
path()برای مسیرهای ساده و خواناre_path()برای مسیرهای پیچیده و برپایهی Regex
- هر URL در نهایت باید به یک تابع یا کلاس متصل شود که ورودی آن
requestاست. - خروجی هر تابع یک HttpResponse است که محتوای صفحه را برمیگرداند.
بنابراین مسیر کامل از درخواست تا پاسخ به این صورت است:
کاربر → وارد کردن URL در مرورگر → Root URLConf → urlpatterns → View Function → HttpResponse → نمایش در مرورگر