Какую архитектуру проектирования использует Django?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Архитектура Django
Django использует архитектуру MTV (Model-Template-View), которая является вариацией классического паттерна MVC (Model-View-Controller). Однако терминология в Django отличается от стандартной MVC.
MTV архитектура Django:
Model (Модель) Отвечает за работу с данными и БД:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey('User', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
class Meta:
ordering = ['-created_at']
Модель определяет структуру данных, валидацию и отношения между таблицами.
Template (Шаблон) Отвечает за представление данных (HTML):
<!-- templates/post_list.html -->
<div class="posts">
{% for post in posts %}
<article class="post">
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
<small>{{ post.created_at|date:"j F Y" }}</small>
</article>
{% endfor %}
</div>
Шаблоны используют Django template language для динамического контента.
View (Вид) Отвечает за бизнес-логику и обработку запросов:
from django.shortcuts import render
from .models import Post
# Function-based view
def post_list(request):
posts = Post.objects.all().order_by('-created_at')
return render(request, 'post_list.html', {'posts': posts})
# Class-based view (современный подход)
from django.views import View
from django.views.generic import ListView
class PostListView(ListView):
model = Post
template_name = 'post_list.html'
context_object_name = 'posts'
paginate_by = 10
def get_queryset(self):
return Post.objects.all().order_by('-created_at')
Различие Django MTV и стандартной MVC:
| Слой | Django MTV | Стандартная MVC |
|---|---|---|
| Model | Модель БД | Модель данных |
| Template | HTML (шаблон) | View (представление) |
| View | Controller (контроллер) | Логика |
Django переименовал компоненты, но суть осталась MVC.
Полный цикл работы Django:
1. URL маршрутизация (urls.py)
from django.urls import path
from . import views
urlpatterns = [
path('posts/', views.PostListView.as_view(), name='post_list'),
path('posts/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
path('posts/create/', views.PostCreateView.as_view(), name='post_create'),
]
2. Обработка запроса (views.py)
class PostDetailView(DetailView):
model = Post
template_name = 'post_detail.html'
context_object_name = 'post'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = self.object.comments.all()
return context
3. Подготовка данных (models.py)
class Post(models.Model):
# Модель автоматически создаёт таблицу
# и методы для работы с БД
pass
4. Рендеринг шаблона (template)
<h1>{{ post.title }}</h1>
<div class="comments">
{% for comment in comments %}
<p>{{ comment.text }}</p>
{% endfor %}
</div>
5. Возврат HTML клиенту
ORM (Object-Relational Mapping) в Django:
Django ORM позволяет работать с БД через объекты Python:
# Create
post = Post.objects.create(
title="Hello",
content="World",
author=user
)
# Read
posts = Post.objects.all()
post = Post.objects.get(id=1)
recent = Post.objects.filter(created_at__gte=timezone.now() - timedelta(days=7))
# Update
post.title = "Updated"
post.save()
# Delete
post.delete()
Middleware в Django:
Промежуточное ПО, обрабатывающее каждый запрос/ответ:
class LoggingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print(f"Request: {request.method} {request.path}")
response = self.get_response(request)
print(f"Response: {response.status_code}")
return response
# В settings.py
MIDDLEWARE = [
'myapp.middleware.LoggingMiddleware',
]
Компоненты Django:
- Models — ORM для работы с БД
- Views — обработка логики
- Templates — отображение HTML
- URLs — маршрутизация запросов
- Forms — валидация и обработка форм
- Admin — автоматическое создание админ-панели
- Signals — реактивное программирование
- Middleware — обработка всех запросов
- Managers — кастомные запросы к БД
Отличие от FastAPI:
Django — это полнофункциональный фреймворк со встроенным шаблонизатором и ORM.
FastAPI — это микрофреймворк для REST API, без встроенных шаблонов.
# Django — все встроено
from django.shortcuts import render
# FastAPI — нужно добавлять вручную
from fastapi import FastAPI
from sqlalchemy import Column, String
Лучшие практики Django:
- Используй Class-Based Views вместо Function-Based Views (DRY)
- Кеширование для оптимизации БД запросов
- Signals осторожно — они усложняют отладку
- Migrations для изменения схемы БД
- Settings.py разделение для dev/prod конфигов
- Тестирование через django.test.TestCase
Django MTV архитектура — это проверенный и мощный подход для разработки полнофункциональных веб-приложений с минимальным boilerplate кодом.