آموزش جامع URL Routing در Django

آنچه در این مبحث می خوانید

در جنگو، یکی از مفاهیم حیاتی که نقش مستقیم در نمایش صفحات وب ایفا می‌کند، مفهوم 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/<int:id>/', 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<year>[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("<h1>درباره ما</h1>")
				
			

در اینجا تابع 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:

  1. Root URLConf نقطه‌ی شروع تمام مسیرهاست.
  2. لیست urlpatterns مسیرها را به ویوها متصل می‌کند.
  3. دو متد مهم برای تعریف URL وجود دارد:
    • path() برای مسیرهای ساده و خوانا
    • re_path() برای مسیرهای پیچیده و برپایه‌ی Regex
  4. هر URL در نهایت باید به یک تابع یا کلاس متصل شود که ورودی آن request است.
  5. خروجی هر تابع یک HttpResponse است که محتوای صفحه را برمی‌گرداند.

بنابراین مسیر کامل از درخواست تا پاسخ به این صورت است:

				
					کاربر → وارد کردن URL در مرورگر → Root URLConf → urlpatterns → View Function → HttpResponse → نمایش در مرورگر
				
			
عیب‌یابی کامل وب‌سایت و اپلیکیشن ارائه می‌دهیم تا کسب‌وکارها بتوانند با اطمینان بیشتری در فضای دیجیتال فعالیت کنند.
در رشدینو۳۶۰ خدمت ویژه‌ای به نام *طراحی وب‌اپ ارائه می‌دهیم که مخصوص کسب‌وکارهایی است که سایت دارند و می‌خواهند تجربه‌ای مدرن‌تر و حرفه‌ای‌تر برای مشتریانشان بسازند.
صفحه‌ی فروش، محصولی نوآورانه از رشدینو۳۶۰ است که ویژه کسب‌وکارهای کوچک و محلی طراحی شده تا حضور آنلاینشان را ساده‌تر و قدرتمندتر کند.
در رشدینو۳۶۰ ما خدمت سئو را به‌صورت اشتراک‌های ۳ ماهه، ۶ ماهه و سالانه ارائه می‌دهیم.