JuniorPython Developer > Основы Python > Django и DRF
Короткий ответ Используется декоратор @require_http_methods([...]) (или @require_GET/@require_POST); при запросе не входящим в разрешённый список методом Django вернёт 405 Method Not Allowed. Как это работает подробнее Декоратор оборачивает view и перед вызовом проверяет request.method; если метод не в разрешённом списке, возвращается HttpResponseNotAllowed со статусом 405 и заголовком Allow, перечисляющим допустимые методы, а сама view-функция не выполняется. Пример кода Что использовать на практике Практика. Такой декоратор полезен для FBV, когда нужно явно задокументировать и защитить, какие методы поддерживает view, не прописывая ручную проверку if request.method != 'POST': return HttpResponseNotAllowed(...) в каждой функции. Подводные камни Риск. Забывают, что CBV (class View) уже сами возвращают 405 для неопределённых методов без необходимости в декораторе — применение @require_http_methods к CBV избыточно и может конфликтовать; путают 405 (метод не поддерживается) с 403 (запрещён доступ).
djangohttp
MiddlePython Developer > Основы Python > Django и DRF
Короткий ответ В DRF для этого переопределяют EXCEPTION_HANDLER в настройках, указывая собственную функцию-обработчик, которая вызывает стандартный exception_handler DRF для известных исключений и переформатирует его response.data в единую структуру, а также перехватывает непредвиденные исключения для возврата согласованного 500. Как это работает подробнее DRF по умолчанию вызывает функцию, заданную в REST_FRAMEWORK['EXCEPTION_HANDLER'] (по умолчанию rest_framework.views.exception_handler), для любого исключения, возникшего во view, если оно унаследовано от APIException или относится к обрабатываемым (Http404, PermissionDenied). Собственная функция может вызвать оригинальный обработчик, получить стандартный Response, а затем изменить формат response.data под принятый в проекте контракт ошибок. Пример кода Что использовать на практике Практика. Такой единый обработчик упрощает жизнь клиентам API: независимо от того, это ошибка валидации сериализатора, 404 или 403, формат ответа (например, {"error": {"code": ..
configurationdjango
MiddlePython Developer > Основы Python > Django и DRF
Короткий ответ Сначала DRF последовательно пробует классы из authentication_classes, пока один из них не определит пользователя (или не останется анонимный AnonymousUser), и только после этого применяются permission_classes, проверяющие права уже для определённого (в том числе анонимного) пользователя; при неуспехе разрешения клиент получает 401 (если не аутентифицирован) или 403 (если аутентифицирован, но прав не хватает). Как это работает подробнее Каждый класс аутентификации реализует метод authenticate(request), возвращающий пару (user, auth) либо None (если эта схема не применима к запросу, например нет нужного заголовка) либо выбрасывающий исключение AuthenticationFailed (если заголовок есть, но токен невалиден). Если ни один класс не аутентифицировал пользователя, request.user становится AnonymousUser. После этого DRF проверяет каждый permission_class.has_permission(request, view) по очереди — первое False прерывает обработку. Пример кода Что использовать на практике Практика. Код статуса ошибки зависи
authenticationauthorization
JuniorPython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ Параметр пути объявляется как обычный аргумент функции-обработчика с тем же именем, что и в шаблоне пути; тип задаётся аннотацией типа, и FastAPI сам выполняет преобразование и валидацию. Как это работает подробнее FastAPI анализирует строку маршрута (например, /items/{item_id}) и сопоставляет плейсхолдеры с именами параметров функции. Аннотация типа (int, str, UUID и т. д.) используется Pydantic/Starlette для преобразования строки из URL и для генерации схемы OpenAPI. Пример кода Что использовать на практике Практика. Если тип указан как int, а в URL передана не-числовая строка, FastAPI вернёт 422 Unprocessable Entity ещё до выполнения тела функции. Это удобно для базовой валидации без написания ручных проверок. Подводные камни Риск. Забывают, что имя параметра в функции должно точно совпадать с именем в шаблоне пути; также путают Path(...) (для доп. ограничений, например gt=0) с простой аннотацией типа.
fastapipydantic
JuniorPython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ Параметр response_model декоратора эндпоинта задаёт отдельную Pydantic-модель для исходящих данных; FastAPI сериализует возвращаемый объект именно по полям этой модели, отбрасывая лишние. Как это работает подробнее После выполнения функции-обработчика FastAPI прогоняет результат через указанную выходную модель (response_model=UserOut), даже если функция вернула объект с большим количеством полей (например, ORM-модель с паролем). В ответ попадут только поля, описанные в UserOut. Пример кода Что использовать на практике Практика. Разделение входной (UserIn, с паролем) и выходной (UserOut, без пароля) модели — стандартная практика для защиты чувствительных данных и явного контроля контракта API. Подводные камни Риск. Используют одну и ту же модель для входа и выхода и забывают, что в ней есть, например, поле password_hash, которое утечёт в ответ; не задают response_model, рассчитывая, что сериализация «сама всё уберёт».
fastapipydantic
JuniorPython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ Каждая группа маршрутов оформляется как отдельный APIRouter, а затем подключается к основному приложению вызовом app.include_router(router, prefix=...). Как это работает подробнее APIRouter поддерживает те же декораторы (@router.get, @router.post и т. д.), что и основной объект FastAPI. После определения всех маршрутов в модуле, include_router копирует их в основное приложение с заданным префиксом пути и/или тегами для документации. Пример кода Что использовать на практике Практика. Такой подход позволяет разбить крупное приложение на логические модули (users.py, orders.py) по аналогии с Blueprint во Flask, упрощая навигацию и тестирование отдельных частей API. Подводные камни Риск. Забывают указать префикс (prefix='/users') и получают маршруты без ожидаемого пути; подключают один и тот же router несколько раз, из-за чего маршруты регистрируются повторно.
fastapipython
MiddlePython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ Для каждого типа исключений регистрируется обработчик через @app.exception_handler(ТипИсключения), который формирует ответ в едином JSON-формате; для RequestValidationError и собственных исключений (например, DomainError) пишутся отдельные обработчики, возвращающие согласованную структуру. Как это работает подробнее FastAPI/Starlette вызывают зарегистрированный обработчик, соответствующий типу выброшенного исключения (с учётом наследования), вместо стандартного поведения. Внутри обработчика формируется JSONResponse с нужным статусом и телом, одинаковым по структуре для всех типов ошибок приложения. Пример кода Что использовать на практике Практика. Полезно завести базовый класс исключений домена (class AppError(Exception)) с подклассами (NotFoundError, ConflictError) и статус-кодом как атрибутом, чтобы обработчик был один и обобщённый, а не по одному на каждый тип ошибки. Подводные камни Риск. Регистрируют обработчик только для конкретных исключений, забывая про общий Exception (нужно аккуратно
fastapipydantic
JuniorPython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ Параметру функции задаётся обычное значение по умолчанию в сигнатуре (например, limit: int = 10); FastAPI автоматически трактует такой параметр как необязательный query-параметр. Как это работает подробнее Если параметр функции не встречается в шаблоне пути и имеет значение по умолчанию, FastAPI считает его query-параметром и подставляет значение по умолчанию, если клиент его не передал. Пример кода Что использовать на практике Практика. Для дополнительных ограничений (минимум/максимум, описание в OpenAPI) используют Query(default=10, ge=1, le=100) вместо простого литерала — это не меняет поведение по умолчанию, но добавляет валидацию и документацию. Подводные камни Риск. Путают необязательность параметра с Optional[int] без значения по умолчанию (Optional[int] без = None всё равно формально обязателен для передачи null, но не для отсутствия ключа); не указывают разумные границы (ge/le) для параметров пагинации.
fastapipython
MiddlePython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ Зависимость пишется как генератор с yield: код до yield открывает сессию, код после yield (в блоке finally) закрывает её независимо от того, завершился ли обработчик нормально или с исключением. Как это работает подробнее FastAPI поддерживает зависимости-генераторы: всё, что до yield, выполняется перед вызовом эндпоинта, значение после yield передаётся как аргумент, а код после yield выполняется после завершения обработки запроса — причём FastAPI гарантирует вызов этой части даже если эндпоинт выбросил исключение, оборачивая её в try/finally. Пример кода Что использовать на практике Практика. Такой паттерн — стандартный способ управления ресурсами на время запроса (сессия БД, соединение с внешним сервисом, блокировка). Важно использовать именно try/finally внутри зависимости, а не надеяться, что код после yield выполнится «сам по себе» без исключений. Подводные камни Риск. Пишут код закрытия ресурса после yield без try/finally, из-за чего при исключении в обработчике соединение не закрывается и
dependency-injectionfastapi
JuniorPerformance Marketer > Google Ads > События и GA4
Короткий ответ Сессия в GA4 начинается с события session_start и продолжается, пока пользователь активен на сайте; по умолчанию сессия считается завершённой после 30 минут отсутствия активности, а также автоматически начинается новая сессия в полночь по календарю отчёта (если не настроено иначе). Как это работает подробнее GA4 отслеживает временные метки событий пользователя и, если между двумя событиями проходит больше тайм-аута неактивности (по умолчанию 30 минут, настраивается в административных настройках), фиксирует окончание старой сессии и начало новой при следующем действии. Также важно, что отдельное событие session_start отправляется автоматически системой GA4 один раз в начале каждой новой сессии и не требует ручной настройки — в отличие от большинства других событий, которые нужно либо настроить вручную, либо которые относятся к автоматически собираемым (enhanced measurement). Что использовать на практике Практика. Таймаут сессии можно изменить в настройках потока данных GA4 (от 5 минут до несколь
analyticsevents