← Назад к вопросам

Для чего нужен urls.py в Django?

1.3 Junior🔥 221 комментариев
#Django#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Для чего нужен urls.py в Django

urls.py — это файл конфигурации маршрутизации в Django. Он отображает URL (адреса в браузере) на функции-обработчики (view'ы). Это основной способ связать HTTP запросы с вашим кодом.

Основная задача

URLs.py определяет, какой view должен обработать каждый URL запрос.

# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('articles/', views.article_list, name='article_list'),
    path('articles/<int:id>/', views.article_detail, name='article_detail'),
]

Как это работает

GET /articles/           -> article_list()
GET /articles/5/         -> article_detail(id=5)
GET /articles/hello/     -> 404 Not Found

Структура типичного проекта Django

myproject/
├── myproject/
│   ├── settings.py
│   └── urls.py          # ROOT URLconf (главный маршрутизатор)
├── app1/
│   ├── urls.py          # URLs для app1
│   └── views.py
├── app2/
│   ├── urls.py          # URLs для app2
│   └── views.py

Иерархия: root urls.py + app urls.py

# myproject/urls.py (главный файл)
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', include('app1.urls')),  # Подключаем urls app1
    path('api/', include('app2.urls')),       # Подключаем urls app2
]

# app1/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.article_list, name='article_list'),
    path('<int:id>/', views.article_detail, name='article_detail'),
    path('<int:id>/edit/', views.article_edit, name='article_edit'),
]

# Итоговые URLs:
# GET /articles/            -> article_list()
# GET /articles/5/          -> article_detail(id=5)
# GET /articles/5/edit/     -> article_edit(id=5)

Типы параметров в URL'ах

from django.urls import path, re_path
from . import views

urlpatterns = [
    # <type:parameter_name>
    path('users/<int:user_id>/', views.user_detail),      # /users/123/
    path('posts/<slug:slug>/', views.post_by_slug),       # /posts/my-post-title/
    path('files/<str:filename>/', views.download_file),   # /files/document.pdf/
    path('uuid/<uuid:uuid>/', views.get_by_uuid),         # /uuid/abc-123.../
    
    # Regex (для сложных паттернов)
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.articles_by_year),  # /articles/2024/
]

Именование URL'ов (name parameter)

Очень важная практика — давать имена URL'ам для использования в templates и коде:

# urls.py
urlpatterns = [
    path('profile/', views.profile, name='user_profile'),
    path('settings/', views.settings, name='user_settings'),
]

# В template:
<!-- template.html -->
<a href="{% url 'user_profile' %}">Мой профиль</a>
<a href="{% url 'user_settings' %}">Настройки</a>

# В Python коде:
from django.urls import reverse

profile_url = reverse('user_profile')  # '/profile/'
settings_url = reverse('user_settings')  # '/settings/'

Передача параметров в URL'ы

# urls.py
urlpatterns = [
    path('post/<int:post_id>/comment/<int:comment_id>/', views.comment_detail, name='comment_detail'),
]

# template.html
<a href="{% url 'comment_detail' post_id=5 comment_id=10 %}">Комментарий</a>
<!-- Результат: /post/5/comment/10/ -->

# Python
from django.urls import reverse

url = reverse('comment_detail', kwargs={'post_id': 5, 'comment_id': 10})
# url = '/post/5/comment/10/'

URL'ы с query параметрами

# views.py
def search_articles(request):
    query = request.GET.get('q', '')  # Получаем параметр q из query string
    # ?q=django&page=2
    page = request.GET.get('page', 1)
    articles = Article.objects.filter(title__icontains=query)
    return render(request, 'search.html', {'articles': articles})

# urls.py
urlpatterns = [
    path('search/', views.search_articles, name='search'),
]

# Template
<a href="{% url 'search' %}?q=django&page=2">Поиск Django</a>

# Или через reverse в коде:
from django.urls import reverse
url = reverse('search') + '?q=django&page=2'

Разные типы view'ов

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # Function-based view
    path('articles/', views.article_list),
    
    # Class-based view
    path('users/', views.UserListView.as_view()),
    
    # Generic views (встроенные в Django)
    path('posts/', views.PostListView.as_view()),
]

# views.py
from django.views import View
from django.views.generic import ListView
from django.shortcuts import render
from .models import Article, Post

# Function-based view
def article_list(request):
    articles = Article.objects.all()
    return render(request, 'articles.html', {'articles': articles})

# Class-based view
class UserListView(View):
    def get(self, request):
        users = User.objects.all()
        return render(request, 'users.html', {'users': users})

# Generic class-based view
class PostListView(ListView):
    model = Post
    template_name = 'posts.html'
    context_object_name = 'posts'

Методы HTTP в URL'ах

# urls.py не фильтрует методы — это делает view
from django.urls import path
from . import views

urlpatterns = [
    path('articles/', views.articles),  # Обрабатывает GET, POST, PUT, DELETE
]

# views.py
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods

@require_http_methods(['GET', 'POST'])
def articles(request):
    if request.method == 'GET':
        # GET /articles/
        return render(request, 'articles.html')
    elif request.method == 'POST':
        # POST /articles/
        return JsonResponse({'status': 'created'}, status=201)

include() для модульности

# myproject/urls.py
from django.urls import path, include

urlpatterns = [
    path('api/v1/', include('api.urls')),
    path('blog/', include('blog.urls')),
    path('shop/', include('shop.urls')),
]

# api/urls.py
urlpatterns = [
    path('users/', ...),      # /api/v1/users/
    path('posts/', ...),      # /api/v1/posts/
]

# blog/urls.py
urlpatterns = [
    path('articles/', ...),   # /blog/articles/
    path('authors/', ...),    # /blog/authors/
]

# shop/urls.py
urlpatterns = [
    path('products/', ...),   # /shop/products/
    path('orders/', ...),     # /shop/orders/
]

Пример реального API на Django REST Framework

# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSet, CommentViewSet

router = DefaultRouter()
router.register(r'articles', ArticleViewSet)
router.register(r'comments', CommentViewSet)

urlpatterns = [
    path('api/', include(router.urls)),
    path('api-auth/', include('rest_framework.urls')),
]

# Автоматически создаёт URLs:
# GET /api/articles/              - list
# POST /api/articles/             - create
# GET /api/articles/1/            - retrieve
# PUT /api/articles/1/            - update
# DELETE /api/articles/1/         - destroy

Вывод

urls.py — это:

  1. Router — отображает URL на обработчики (view'ы)
  2. Configuration — настройка маршрутов приложения
  3. Convention — стандартный способ в Django для связи web-адресов с кодом
  4. Maintainability — централизованное место для управления маршрутами

Без urls.py Django не знал бы, какой view вызвать при каждом HTTP запросе. Это сердце маршрутизации в Django.