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

Как выдать информацию на все страницы ресурса?

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

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

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

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

Как выдать информацию на все страницы ресурса?

Это классический вопрос о глобальной передаче данных в web-приложении. Вот основные подходы:

1. Context Processors (Django)

Для Django-приложений существует встроенный механизм — context processors. Это функции, которые добавляют переменные в контекст всех шаблонов автоматически.

# myapp/context_processors.py
def site_settings(request):
    return {
        "site_name": "My Website",
        "support_email": "support@example.com",
        "version": "1.0.0",
    }

# settings.py
TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "myapp.context_processors.site_settings",
            ],
        },
    },
]

Этот подход очень удобен для общих данных (название сайта, логотип, контакты).

2. Middleware для добавления информации

Если нужно обогатить запрос дополнительными данными на уровне всего приложения, используй middleware:

# myapp/middleware.py
class UserDataMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Добавляем данные ДО обработки
        request.user_profile = self.get_user_profile(request.user)
        request.settings = self.get_global_settings()
        
        response = self.get_response(request)
        return response

    def get_user_profile(self, user):
        # Логика получения профиля
        return user.profile if hasattr(user, "profile") else None

    def get_global_settings(self):
        # Кэшированные глобальные настройки
        return {"theme": "dark", "language": "ru"}

3. FastAPI — Dependency Injection

В FastAPI для передачи данных на все endpoint'ы используется DI (Dependency Injection):

from fastapi import FastAPI, Depends
from typing import Dict

app = FastAPI()

async def get_global_config() -> Dict:
    """Глобальная конфигурация, доступная всем endpoint'ам"""
    return {
        "api_version": "v1",
        "max_page_size": 100,
        "cache_ttl": 3600,
    }

@app.get("/users")
async def get_users(config: Dict = Depends(get_global_config)):
    max_size = config["max_page_size"]
    return {"items": [], "max_page_size": max_size}

4. Flask — перед обработкой запроса

В Flask используется g объект или before_request hooks:

from flask import Flask, g

app = Flask(__name__)

@app.before_request
def before_request():
    g.user = current_user
    g.site_name = "My Site"
    g.db = connect_to_database()

@app.route("/")
def index():
    return render_template("index.html", site_name=g.site_name)

5. Кэширование глобальных данных

Если данные не меняются часто, их стоит кэшировать:

from functools import lru_cache
from datetime import datetime

@lru_cache(maxsize=1)
def get_global_settings():
    """Кэшируется на время жизни приложения"""
    return {
        "app_name": "MyApp",
        "version": "2.0.0",
        "cached_at": datetime.now().isoformat(),
    }

@lru_cache(maxsize=128)
def get_user_permissions(user_id: int):
    """Кэшируется до 128 разных пользователей"""
    return fetch_permissions_from_db(user_id)

6. Через переменные окружения и конфигурацию

Для некритичных данных (версия, название) используй переменные окружения:

import os
from typing import TypedDict

class AppConfig(TypedDict):
    APP_NAME: str
    APP_VERSION: str
    DEBUG: bool

config: AppConfig = {
    "APP_NAME": os.getenv("APP_NAME", "MyApp"),
    "APP_VERSION": os.getenv("APP_VERSION", "1.0.0"),
    "DEBUG": os.getenv("DEBUG", "False").lower() == "true",
}

Рекомендации:

  • Context Processors — для шаблонов и статичных данных
  • Middleware — для обогащения request объекта
  • Dependency Injection — в современных фреймворках (FastAPI)
  • Кэширование — если данные редко меняются
  • Переменные окружения — для конфигурации

Выбор подхода зависит от фреймворка и характера данных (статичные ли они, нужна ли кэширование, зависит ли от пользователя).