← Назад к вопросам
Для чего нужен 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 — это:
- Router — отображает URL на обработчики (view'ы)
- Configuration — настройка маршрутов приложения
- Convention — стандартный способ в Django для связи web-адресов с кодом
- Maintainability — централизованное место для управления маршрутами
Без urls.py Django не знал бы, какой view вызвать при каждом HTTP запросе. Это сердце маршрутизации в Django.