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

Есть ли у тебя опыт написания собственного MVC фреймворка?

2.0 Middle🔥 71 комментариев
#Django#FastAPI и Flask#Архитектура и паттерны

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

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

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

Опыт разработки собственного MVC фреймворка

Да, у меня есть практический опыт создания собственного MVC фреймворка. Это был очень ценный опыт, который глубоко помог понять, как работают современные фреймворки вроде Django и Flask.

Мой проект MVC фреймворка

Контекст и причина

Когда я изучал веб-разработку, я создал простой MVC фреймворк для того, чтобы понять внутренние механизмы:

  • Как работает маршрутизация URL
  • Как обрабатываются запросы
  • Как рендерятся шаблоны
  • Как устроена ORM

Основные компоненты

# Роутер (URL маршрутизация)
class Router:
    def __init__(self):
        self.routes = {}
    
    def add_route(self, path, handler, methods=['GET']):
        self.routes[path] = {'handler': handler, 'methods': methods}
    
    def match(self, path, method):
        if path in self.routes:
            route = self.routes[path]
            if method in route['methods']:
                return route['handler']
        return None

# Контроллер (обработка запросов)
class BaseController:
    def __init__(self, request):
        self.request = request
    
    def render(self, template_name, context=None):
        return self.template_engine.render(template_name, context or {})

# Модель (работа с БД)
class Model:
    table_name = None
    
    @classmethod
    def all(cls):
        query = f"SELECT * FROM {cls.table_name}"
        return cls.db.execute(query).fetchall()
    
    @classmethod
    def find(cls, id):
        query = f"SELECT * FROM {cls.table_name} WHERE id = %s"
        return cls.db.execute(query, (id,)).fetchone()

Основной цикл приложения

class Application:
    def __init__(self):
        self.router = Router()
        self.template_engine = TemplateEngine()
    
    def route(self, path, methods=['GET']):
        def decorator(handler):
            self.router.add_route(path, handler, methods)
            return handler
        return decorator
    
    def handle_request(self, path, method, body):
        handler = self.router.match(path, method)
        if not handler:
            return self.render_404()
        
        request = Request(path, method, body)
        response = handler(request)
        return response

Что я изучил из этого проекта

1. Маршрутизация

  • Как парсить URL и извлекать параметры
  • Регулярные выражения для гибких маршрутов
  • Приоритет маршрутов

2. Обработка запросов

  • Жизненный цикл HTTP запроса
  • Middleware и их роль
  • Обработка ошибок и исключений
# Простой middleware
class AuthMiddleware:
    def process_request(self, request):
        if not request.has_cookie('session_id'):
            return Response(status=401)
        return None
    
    def process_response(self, response):
        response.set_header('X-Custom', 'value')
        return response

3. Шаблонизация

  • Как парсить шаблоны
  • Переменные и условия в шаблонах
  • Наследование шаблонов
class TemplateEngine:
    def render(self, template_name, context):
        with open(f'templates/{template_name}') as f:
            template = f.read()
        
        # Замена переменных
        for key, value in context.items():
            template = template.replace(f'{{{key}}}', str(value))
        
        return template

4. ORM (Object-Relational Mapping)

  • Как маппировать объекты на таблицы БД
  • Связи между моделями (One-to-Many, Many-to-Many)
  • Lazy loading vs Eager loading
class User(Model):
    table_name = 'users'
    
    def posts(self):
        query = f"SELECT * FROM posts WHERE user_id = %s"
        return self.db.execute(query, (self.id,)).fetchall()

user = User.find(1)
posts = user.posts()  # Lazy loading

Сравнение с Django и Flask

После создания своего фреймворка я лучше понимаю:

Django:

  • Почему важна структурирация приложений (apps)
  • Сложность ORM (relationships, querysets)
  • Зачем нужна система миграций

Flask:

  • Его минимализм и гибкость
  • Как Blueprints позволяют модульность
  • Минус: отсутствие встроенной ORM

Практическое применение знаний

Этот опыт помог мне:

  • Эффективнее использовать Django и Flask — я понимаю, что происходит под капотом
  • Правильнее архитектурировать приложения — знаю, какие компоненты нужны и почему
  • Отлаживать проблемы — могу предположить, где может быть ошибка
  • Оптимизировать производительность — знаю узкие места

Рекомендации для других разработчиков

Я рекомендую каждому разработчику написать свой простой фреймворк, потому что:

  1. Глубокое понимание веб-разработки
  2. Уважение к существующим фреймворкам и их дизайну
  3. Навык архитектурного проектирования
  4. Умение отлаживать на глубинном уровне

Это не значит, что нужно создавать production-ready фреймворк. Даже простой прототип даёт огромную ценность в понимании.