Автоматизация ломается не в коде, а в предположениях о входных данных
Скрипт для парсинга, отчётов или синхронизации обычно пишут под «нормальный» кейс: один формат, одна схема, один источник. Потом в бою прилетает пустое поле, лишний символ, дубль или таймаут — и пайплайн молча портит данные.
Что помогает держать автоматизацию живой:
— валидировать вход на границе: pydantic, явные проверки, whitelist полей;
— делать операции идемпотентными: повторный запуск не должен плодить дубли;
— отделять сбор данных от записи: сначала сырой слой, потом преобразование;
— логировать не только ошибки, но и «подозрительные успехи»: пустые ответы, частичные выборки, неожиданные типы.
Ещё одна типовая ошибка — смешивать бизнес-логику и инфраструктуру. Когда парсер сам решает, как ретраить, как маппить поля и куда слать уведомление, его трудно тестировать и ещё труднее менять. Лучше держать шаги отдельно: fetch → validate → transform → store → notify.
Если автоматизация должна жить долго, проектируйте её как набор маленьких повторяемых операций, а не как один «магический» скрипт: так она переживёт любой шум во входных данных.
Скрипт для парсинга, отчётов или синхронизации обычно пишут под «нормальный» кейс: один формат, одна схема, один источник. Потом в бою прилетает пустое поле, лишний символ, дубль или таймаут — и пайплайн молча портит данные.
Что помогает держать автоматизацию живой:
— валидировать вход на границе: pydantic, явные проверки, whitelist полей;
— делать операции идемпотентными: повторный запуск не должен плодить дубли;
— отделять сбор данных от записи: сначала сырой слой, потом преобразование;
— логировать не только ошибки, но и «подозрительные успехи»: пустые ответы, частичные выборки, неожиданные типы.
Ещё одна типовая ошибка — смешивать бизнес-логику и инфраструктуру. Когда парсер сам решает, как ретраить, как маппить поля и куда слать уведомление, его трудно тестировать и ещё труднее менять. Лучше держать шаги отдельно: fetch → validate → transform → store → notify.
Если автоматизация должна жить долго, проектируйте её как набор маленьких повторяемых операций, а не как один «магический» скрипт: так она переживёт любой шум во входных данных.
This media is not supported in your browser
VIEW IN TELEGRAM
Как заработать 2500$ с УБТ трафика из Twitter’а не привлекая внимания санитаров
Арбитражник проkил органическbq трафик с X (Twitter) через связку с dating-офферами, используя маскировку ссылок под видеопревью. После полугода залива с марта по октябрь 2025-го он заработал скромный, но стабильный доход, внедрив динамическую генерацию страниц, обфускацию ссылок и cookie-разделение трафика для увеличения конверсии на треть. Основной вызов — постоянные баны доменом из-за обновлений Google и требований антифрода, из…
➡️ Читайте на сайте: https://aff.top/blog/kak-zarabotat-2500-s-ubt-trafika-iz-twitter-a-ne-privlekaia-vnimaniia-sanitarov
🧠 Ещё больше инсайтов → в канале AFF.top
Арбитражник проkил органическbq трафик с X (Twitter) через связку с dating-офферами, используя маскировку ссылок под видеопревью. После полугода залива с марта по октябрь 2025-го он заработал скромный, но стабильный доход, внедрив динамическую генерацию страниц, обфускацию ссылок и cookie-разделение трафика для увеличения конверсии на треть. Основной вызов — постоянные баны доменом из-за обновлений Google и требований антифрода, из…
➡️ Читайте на сайте: https://aff.top/blog/kak-zarabotat-2500-s-ubt-trafika-iz-twitter-a-ne-privlekaia-vnimaniia-sanitarov
🧠 Ещё больше инсайтов → в канале AFF.top
asyncio ломается не там, где await забыли, а там, где смешали блокировки и гонки
В Python async помогает держать много I/O-задач без лишних потоков, но не делает код «быстрым сам по себе». Если внутри корутины есть sync-вызов, долгий CPU-цикл или скрытая блокировка, event loop замирает, а остальные задачи ждут.
Проверьте три места:
• сетевые клиенты и драйверы — должны быть реально async, а не обёрткой над sync;
• тяжёлые вычисления — выносите в process pool или отдельный worker;
• общие объекты — защищайте lock’ами, иначе ловите race condition даже без потоков.
Ещё один частый провал — бесконтрольный create_task. Если задачу не сохранить, не дождаться и не обработать исключение, ошибки исчезают в тишину. Для фоновых работ нужен явный список задач, отмена по shutdown и сбор результатов через gather или as_completed.
Если коротко: в asyncio важно не «писать await везде», а убирать блокировки, ограничивать конкурентность и заранее продумывать отмену. Тогда async даёт предсказуемую нагрузку, а не красивую иллюзию параллельности.
В Python async помогает держать много I/O-задач без лишних потоков, но не делает код «быстрым сам по себе». Если внутри корутины есть sync-вызов, долгий CPU-цикл или скрытая блокировка, event loop замирает, а остальные задачи ждут.
Проверьте три места:
• сетевые клиенты и драйверы — должны быть реально async, а не обёрткой над sync;
• тяжёлые вычисления — выносите в process pool или отдельный worker;
• общие объекты — защищайте lock’ами, иначе ловите race condition даже без потоков.
Ещё один частый провал — бесконтрольный create_task. Если задачу не сохранить, не дождаться и не обработать исключение, ошибки исчезают в тишину. Для фоновых работ нужен явный список задач, отмена по shutdown и сбор результатов через gather или as_completed.
Если коротко: в asyncio важно не «писать await везде», а убирать блокировки, ограничивать конкурентность и заранее продумывать отмену. Тогда async даёт предсказуемую нагрузку, а не красивую иллюзию параллельности.
5 мест в FastAPI, где чаще всего прячутся баги интеграций и падение производительности
FastAPI любят за скорость старта, но в проде боль обычно не в роутинге, а в мелочах вокруг него. Есть наблюдение которое стоит проверить: если API «тормозит», причина часто в валидации, блокирующем коде и лишних преобразованиях данных.
• Не тяните тяжёлые запросы в синхронные функции внутри async-эндпоинта. Один `requests.get()` или работа с файлом без выноса в пул — и event loop уже занят.
• Не делайте сложные Pydantic-схемы на каждый чих. Глубокие вложенности, кастомные валидаторы и лишние `model_dump()` съедают время на горячих путях.
• Не смешивайте транспорт и доменную логику в одном обработчике. Чем тоньше endpoint, тем проще тестировать, профилировать и переиспользовать код.
Ещё один частый провал — ответы с лишними полями и неявной сериализацией. Если отдаёте ORM-объекты как есть, проверьте, что нет скрытых обращений к базе и ленивых связей. В интеграциях это особенно заметно: один эндпоинт выглядит невинно, а под нагрузкой внезапно начинает делать десятки лишних операций.
Для стабильного API держите правило: в endpoint — минимум логики, внутри — явные async/sync границы, снаружи — схемы и контракты, которые не заставляют Python работать больше, чем нужно.
FastAPI любят за скорость старта, но в проде боль обычно не в роутинге, а в мелочах вокруг него. Есть наблюдение которое стоит проверить: если API «тормозит», причина часто в валидации, блокирующем коде и лишних преобразованиях данных.
• Не тяните тяжёлые запросы в синхронные функции внутри async-эндпоинта. Один `requests.get()` или работа с файлом без выноса в пул — и event loop уже занят.
• Не делайте сложные Pydantic-схемы на каждый чих. Глубокие вложенности, кастомные валидаторы и лишние `model_dump()` съедают время на горячих путях.
• Не смешивайте транспорт и доменную логику в одном обработчике. Чем тоньше endpoint, тем проще тестировать, профилировать и переиспользовать код.
Ещё один частый провал — ответы с лишними полями и неявной сериализацией. Если отдаёте ORM-объекты как есть, проверьте, что нет скрытых обращений к базе и ленивых связей. В интеграциях это особенно заметно: один эндпоинт выглядит невинно, а под нагрузкой внезапно начинает делать десятки лишних операций.
Для стабильного API держите правило: в endpoint — минимум логики, внутри — явные async/sync границы, снаружи — схемы и контракты, которые не заставляют Python работать больше, чем нужно.
5 ошибок в Python-скриптах, из-за которых автоматизация ломается на ровном месте
Скрипт может «работать у тебя», но падать на сервере, в cron или в пайплайне. Чаще всего проблема не в Python, а в том, как написан вход, выход и обработка ошибок.
— Не проверяют входные данные: пустые строки, битый JSON, неожиданные ключи. Любой парсер должен падать предсказуемо, а не в середине цепочки.
— Ловят
— Пишут всё в один файл без ротации и без явного пути. Потом лог теряется, права не совпадают, а отладка превращается в квест.
Ещё две типовые проблемы: зависимость от текущей директории и отсутствие таймаутов в HTTP-запросах. Первый пункт ломает запуск из cron и CI, второй — вешает воркер на неопределённое время.
Если скрипт нужен не «для себя», а как часть процесса, добавь три вещи: явные пути, нормальные исключения с кодом выхода и таймауты на внешние запросы. Тогда автоматизация перестанет быть хрупкой.
Скрипт может «работать у тебя», но падать на сервере, в cron или в пайплайне. Чаще всего проблема не в Python, а в том, как написан вход, выход и обработка ошибок.
— Не проверяют входные данные: пустые строки, битый JSON, неожиданные ключи. Любой парсер должен падать предсказуемо, а не в середине цепочки.
— Ловят
Exception везде подряд. В итоге ошибка скрыта, а задача помечена как успешная.— Пишут всё в один файл без ротации и без явного пути. Потом лог теряется, права не совпадают, а отладка превращается в квест.
Ещё две типовые проблемы: зависимость от текущей директории и отсутствие таймаутов в HTTP-запросах. Первый пункт ломает запуск из cron и CI, второй — вешает воркер на неопределённое время.
Если скрипт нужен не «для себя», а как часть процесса, добавь три вещи: явные пути, нормальные исключения с кодом выхода и таймауты на внешние запросы. Тогда автоматизация перестанет быть хрупкой.
asyncio ломается не в коде, а в месте, где вы смешали ожидание и блокировку
Главная ошибка — считать, что async сам ускоряет всё подряд. Он хорошо работает там, где есть ожидание сети, диска, очереди или таймера. Как только внутри корутины появляется тяжёлый CPU-кусок, синхронный ORM-вызов или sleep из стандартной библиотеки, event loop начинает простаивать.
Есть три типовых правила:
— не вызывайте блокирующие функции из корутины без выноса в thread/process pool;
— не плодите задачи без лимита, иначе получите не скорость, а очередь и память;
— не путайте
Если нужен контроль, стройте узкие места явно: ограничитель concurrency через Semaphore, таймауты на внешние запросы, отдельный пул для тяжёлых операций. Для интеграций это почти всегда важнее, чем «перевести всё на async».
Проверка простая: если убрать внешнее ожидание, а код почти не теряет время — asyncio вам нужен не для ускорения, а для управляемого I/O.
Главная ошибка — считать, что async сам ускоряет всё подряд. Он хорошо работает там, где есть ожидание сети, диска, очереди или таймера. Как только внутри корутины появляется тяжёлый CPU-кусок, синхронный ORM-вызов или sleep из стандартной библиотеки, event loop начинает простаивать.
Есть три типовых правила:
— не вызывайте блокирующие функции из корутины без выноса в thread/process pool;
— не плодите задачи без лимита, иначе получите не скорость, а очередь и память;
— не путайте
await с параллельностью: порядок выполнения решает планировщик, а не ваш список вызовов.Если нужен контроль, стройте узкие места явно: ограничитель concurrency через Semaphore, таймауты на внешние запросы, отдельный пул для тяжёлых операций. Для интеграций это почти всегда важнее, чем «перевести всё на async».
Проверка простая: если убрать внешнее ожидание, а код почти не теряет время — asyncio вам нужен не для ускорения, а для управляемого I/O.
asyncio ломается не там, где «медленно», а там, где его кормят блокировками
За неделю в репах чаще всего всплывают одни и те же ошибки:
— внутри корутины вызывают тяжелый sync-код: requests, ORM без async, файловые операции;
— забывают про лимиты параллелизма и запускают сотни задач через gather без контроля;
— держат один общий client/session и не закрывают его;
— ловят исключения только в одной задаче, а остальные тихо падают.
Если есть I/O, используй await до конца цепочки. Если попался синхронный кусок, выноси его в thread pool или отдельный процесс. Иначе event loop начинает обслуживать не задачи, а ожидание чужих блокировок.
Для контроля нагрузки нужны семафоры, очереди и явные таймауты. Без них asyncio легко превращается в генератор случайных зависаний: внешняя API отвечает медленно, а у тебя уже забиты все воркеры и растет хвост из висящих задач.
Еще одна типовая ошибка — отсутствие отмены и cleanup. Task cancelled не должен оставлять открытые соединения, незакрытые файлы и полумертвые записи в БД. Лучше один раз написать аккуратный finally, чем потом искать утечки по логам.
Главное правило: asyncio ускоряет только то, что умеет ждать. Все остальное он просто делает более заметным.
За неделю в репах чаще всего всплывают одни и те же ошибки:
— внутри корутины вызывают тяжелый sync-код: requests, ORM без async, файловые операции;
— забывают про лимиты параллелизма и запускают сотни задач через gather без контроля;
— держат один общий client/session и не закрывают его;
— ловят исключения только в одной задаче, а остальные тихо падают.
Если есть I/O, используй await до конца цепочки. Если попался синхронный кусок, выноси его в thread pool или отдельный процесс. Иначе event loop начинает обслуживать не задачи, а ожидание чужих блокировок.
Для контроля нагрузки нужны семафоры, очереди и явные таймауты. Без них asyncio легко превращается в генератор случайных зависаний: внешняя API отвечает медленно, а у тебя уже забиты все воркеры и растет хвост из висящих задач.
Еще одна типовая ошибка — отсутствие отмены и cleanup. Task cancelled не должен оставлять открытые соединения, незакрытые файлы и полумертвые записи в БД. Лучше один раз написать аккуратный finally, чем потом искать утечки по логам.
Главное правило: asyncio ускоряет только то, что умеет ждать. Все остальное он просто делает более заметным.
Pydantic ломают не типы, а привычка валидировать «на глаз»
Если модель используется как контракт, держите в ней только входные данные и правила проверки. Не тащите туда бизнес-логику, запросы к БД и вычисления, которые зависят от окружения — иначе объект становится неудобным и плохо тестируется.
Есть наблюдение которое стоит проверить: большинство багов рождается не в самих полях, а на границе между сырым словарём и моделью. Там полезно явно фиксировать:
— обязательные поля и значения по умолчанию;
— алиасы для внешнего API;
— строгие типы там, где нельзя «догадываться»;
— отдельные модели для входа и ответа.
Ещё одна типовая ошибка — полагаться на «автоматическое приведение». Строка в число, пустая строка в None, лишний ключ в payload — всё это удобно до первого инцидента. Если формат важен, лучше сделать ошибку явной, чем потом искать, почему данные тихо исказились 🔧
Для сложных payload’ов помогает правило: одна модель — одна задача. Вложенные структуры разбивайте на маленькие схемы, а преобразования выносите в отдельные функции. Тогда сериализация, валидация и тесты перестают мешать друг другу.
Итог простой: Pydantic особенно силён там, где нужно жёстко описать границу системы. Чем раньше выловили мусорный вход, тем меньше кода придётся чинить дальше по цепочке.
Если модель используется как контракт, держите в ней только входные данные и правила проверки. Не тащите туда бизнес-логику, запросы к БД и вычисления, которые зависят от окружения — иначе объект становится неудобным и плохо тестируется.
Есть наблюдение которое стоит проверить: большинство багов рождается не в самих полях, а на границе между сырым словарём и моделью. Там полезно явно фиксировать:
— обязательные поля и значения по умолчанию;
— алиасы для внешнего API;
— строгие типы там, где нельзя «догадываться»;
— отдельные модели для входа и ответа.
Ещё одна типовая ошибка — полагаться на «автоматическое приведение». Строка в число, пустая строка в None, лишний ключ в payload — всё это удобно до первого инцидента. Если формат важен, лучше сделать ошибку явной, чем потом искать, почему данные тихо исказились 🔧
Для сложных payload’ов помогает правило: одна модель — одна задача. Вложенные структуры разбивайте на маленькие схемы, а преобразования выносите в отдельные функции. Тогда сериализация, валидация и тесты перестают мешать друг другу.
Итог простой: Pydantic особенно силён там, где нужно жёстко описать границу системы. Чем раньше выловили мусорный вход, тем меньше кода придётся чинить дальше по цепочке.
5 ошибок в FastAPI, которые ломают проект раньше, чем нагрузка
FastAPI легко стартует, и из-за этого в нем часто пропускают базовую архитектуру. Потом появляются «магические» зависимости, дубли схем и ручные костыли там, где должны работать слои приложения.
— Тяжелую логику пихают в path operation. Эндпоинт должен принимать запрос и отдавать ответ, а не собирать бизнес-процесс.
— Смешивают Pydantic-модели для входа, ответа и внутреннего домена. В итоге любое изменение тянет цепочку правок по всему коду.
— Не выносят работу с БД в отдельный слой. Когда ORM живет прямо в роуте, тесты и рефакторинг превращаются в ремонт на ходу.
— Злоупотребляют Depends. Если зависимость делает больше, чем внедрение сервиса или сессии, это уже скрытая бизнес-логика.
Еще одна типовая проблема — отсутствие явных границ между API, сервисами и инфраструктурой. Пока проект маленький, это не мешает. Потом любой новый сценарий начинает ломать старые ручки, потому что все связано со всем.
Если держать роуты тонкими, модели раздельными, а БД и внешние сервисы изолировать за интерфейсами, FastAPI остается быстрым не только в запросах, но и в разработке.
FastAPI легко стартует, и из-за этого в нем часто пропускают базовую архитектуру. Потом появляются «магические» зависимости, дубли схем и ручные костыли там, где должны работать слои приложения.
— Тяжелую логику пихают в path operation. Эндпоинт должен принимать запрос и отдавать ответ, а не собирать бизнес-процесс.
— Смешивают Pydantic-модели для входа, ответа и внутреннего домена. В итоге любое изменение тянет цепочку правок по всему коду.
— Не выносят работу с БД в отдельный слой. Когда ORM живет прямо в роуте, тесты и рефакторинг превращаются в ремонт на ходу.
— Злоупотребляют Depends. Если зависимость делает больше, чем внедрение сервиса или сессии, это уже скрытая бизнес-логика.
Еще одна типовая проблема — отсутствие явных границ между API, сервисами и инфраструктурой. Пока проект маленький, это не мешает. Потом любой новый сценарий начинает ломать старые ручки, потому что все связано со всем.
Если держать роуты тонкими, модели раздельными, а БД и внешние сервисы изолировать за интерфейсами, FastAPI остается быстрым не только в запросах, но и в разработке.
Pydantic ломается не на валидации, а на неаккуратной схеме данных
Если модель нужна для API, начните не с полей, а с границы входа: где строка превращается в тип, где пустое значение считается ошибкой, где можно подставить дефолт. Именно там чаще всего прячутся баги, а не в самих аннотациях.
Три правила, которые экономят часы:
— не смешивайте «как пришло» и «как храню» в одной модели;
— для внешнего JSON держите отдельный слой, а внутренние объекты делайте уже нормализованными;
— сложные поля собирайте через
Если модель начинает разрастаться, смотрите на признаки:
• один и тот же класс используется для request, response и ORM;
• часть полей нужна только для админки;
• валидация зависит от комбинации нескольких значений.
В такой точке лучше разделить схемы на маленькие: входная, выходная, общая база, отдельный DTO для редких кейсов.
Ещё одна типовая ошибка — пытаться сделать Pydantic «магией для всего». Он хорош там, где нужно явно описать контракт, а не скрыть бизнес-логику. Чем меньше неявности в схеме, тем проще тесты, автодоки и рефакторинг. Плохая модель почти всегда дороже плохого SQL.
Если модель нужна для API, начните не с полей, а с границы входа: где строка превращается в тип, где пустое значение считается ошибкой, где можно подставить дефолт. Именно там чаще всего прячутся баги, а не в самих аннотациях.
Три правила, которые экономят часы:
— не смешивайте «как пришло» и «как храню» в одной модели;
— для внешнего JSON держите отдельный слой, а внутренние объекты делайте уже нормализованными;
— сложные поля собирайте через
field_validator или model_validator, а не через ручной if по всему коду.Если модель начинает разрастаться, смотрите на признаки:
• один и тот же класс используется для request, response и ORM;
• часть полей нужна только для админки;
• валидация зависит от комбинации нескольких значений.
В такой точке лучше разделить схемы на маленькие: входная, выходная, общая база, отдельный DTO для редких кейсов.
Ещё одна типовая ошибка — пытаться сделать Pydantic «магией для всего». Он хорош там, где нужно явно описать контракт, а не скрыть бизнес-логику. Чем меньше неявности в схеме, тем проще тесты, автодоки и рефакторинг. Плохая модель почти всегда дороже плохого SQL.
5 Django-ошибок, которые ломают проект не в коде, а в архитектуре
Django часто ругают за «магии», но в реальности проблемы обычно в том, как проект собран. Самые дорогие ошибки повторяются из репы в репу: один большой app, смешанные домены, и модели, которые знают слишком много о внешнем мире.
— Ставить всё в один app. Потом сложно выделить платежи, пользователей, каталог и интеграции без боли.
— Тянуть бизнес-логику в views. В итоге тесты хрупкие, а повторное использование почти нулевое.
— Делать модели жирными, но без границ: `save()`, сигналы, кэш, внешние запросы — всё в одном месте.
— Игнорировать сервисный слой. Когда появляется фоноваая задача или API-метод, код начинают копировать.
Рабочее правило простое: model хранит состояние, service — правила, view — вход и выход. Если в сервисе уже есть 200 строк, это не повод «добавить ещё чуть-чуть», а сигнал резать на сценарии и выделять зависимости.
Ещё один маркер зрелости — тестируемость. Если бизнес-поток нельзя прогнать без HTTP и базы, архитектура уже перепутала уровни. Для Django это особенно заметно на проектах, где быстро растут интеграции и админка.
Чем раньше проект разделён по ответственности, тем дешевле потом добавлять фичи, очереди и API без переписывания половины кода.
Django часто ругают за «магии», но в реальности проблемы обычно в том, как проект собран. Самые дорогие ошибки повторяются из репы в репу: один большой app, смешанные домены, и модели, которые знают слишком много о внешнем мире.
— Ставить всё в один app. Потом сложно выделить платежи, пользователей, каталог и интеграции без боли.
— Тянуть бизнес-логику в views. В итоге тесты хрупкие, а повторное использование почти нулевое.
— Делать модели жирными, но без границ: `save()`, сигналы, кэш, внешние запросы — всё в одном месте.
— Игнорировать сервисный слой. Когда появляется фоноваая задача или API-метод, код начинают копировать.
Рабочее правило простое: model хранит состояние, service — правила, view — вход и выход. Если в сервисе уже есть 200 строк, это не повод «добавить ещё чуть-чуть», а сигнал резать на сценарии и выделять зависимости.
Ещё один маркер зрелости — тестируемость. Если бизнес-поток нельзя прогнать без HTTP и базы, архитектура уже перепутала уровни. Для Django это особенно заметно на проектах, где быстро растут интеграции и админка.
Чем раньше проект разделён по ответственности, тем дешевле потом добавлять фичи, очереди и API без переписывания половины кода.
This media is not supported in your browser
VIEW IN TELEGRAM
Как уходят из арбитража трафика: интервью с бывшим медиабайером
Интервью с арбитражником, который отработал в сфере с 2019 года и ушёл в другую профессию. Герой рассказывает о работе в Adcombo с тизерками, переходе в криптовертикаль и прямом выкупе трафика, а затем о причинах ухода: выгорание, сложности с поиском новой позиции и переоценка приоритетов. Статья развенчивает миф о лёгких деньгах в арбитраже — это обычная работа с высокими рисками, дефицитом информации и эмоциональным истощением. Выво…
➡️ Читайте на сайте: https://aff.top/blog/kak-ukhodiat-iz-arbitrazha-trafika-interviu-s-byvshim-mediabaierom
🧠 Ещё больше инсайтов → в канале AFF.top
Интервью с арбитражником, который отработал в сфере с 2019 года и ушёл в другую профессию. Герой рассказывает о работе в Adcombo с тизерками, переходе в криптовертикаль и прямом выкупе трафика, а затем о причинах ухода: выгорание, сложности с поиском новой позиции и переоценка приоритетов. Статья развенчивает миф о лёгких деньгах в арбитраже — это обычная работа с высокими рисками, дефицитом информации и эмоциональным истощением. Выво…
➡️ Читайте на сайте: https://aff.top/blog/kak-ukhodiat-iz-arbitrazha-trafika-interviu-s-byvshim-mediabaierom
🧠 Ещё больше инсайтов → в канале AFF.top
Пять ошибок с pydantic, которые тихо ломают валидацию и API-контракты
Если pydantic в проекте уже есть, это ещё не значит, что данные проверяются так, как вы думаете. Чаще всего проблемы сидят не в самой схеме, а в том, как её используют в моделях, ручках и сервисных слоях.
— Не смешивайте входные и внутренние модели: для запроса и для хранения обычно нужны разные схемы. Иначе в API начинают торчать лишние поля или пропадают обязательные.
— Не полагайтесь на неявные преобразования. Строка в число, пустая строка в None, список из одного элемента — такие «помощники» потом сложно искать в багрепортах.
— Не забывайте про default_factory для изменяемых значений. Иначе один список или словарь может незаметно делиться между объектами.
— Не разбрасывайте валидаторы по проекту. Лучше держать правила рядом с полем, чтобы было понятно, где именно рождается ограничение.
Ещё одна частая ошибка — использовать модель как просто контейнер, а потом удивляться, что сериализация отдаёт не то, что ожидали. Если поле важно для контракта, задавайте его явно: тип, optional, alias, ограничения и поведение при отсутствии.
Хорошая привычка простая: сначала описать данные, потом проверить крайние случаи, и только потом подключать модель к обработчику. Тогда pydantic работает как страховка, а не как источник сюрпризов.
Если pydantic в проекте уже есть, это ещё не значит, что данные проверяются так, как вы думаете. Чаще всего проблемы сидят не в самой схеме, а в том, как её используют в моделях, ручках и сервисных слоях.
— Не смешивайте входные и внутренние модели: для запроса и для хранения обычно нужны разные схемы. Иначе в API начинают торчать лишние поля или пропадают обязательные.
— Не полагайтесь на неявные преобразования. Строка в число, пустая строка в None, список из одного элемента — такие «помощники» потом сложно искать в багрепортах.
— Не забывайте про default_factory для изменяемых значений. Иначе один список или словарь может незаметно делиться между объектами.
— Не разбрасывайте валидаторы по проекту. Лучше держать правила рядом с полем, чтобы было понятно, где именно рождается ограничение.
Ещё одна частая ошибка — использовать модель как просто контейнер, а потом удивляться, что сериализация отдаёт не то, что ожидали. Если поле важно для контракта, задавайте его явно: тип, optional, alias, ограничения и поведение при отсутствии.
Хорошая привычка простая: сначала описать данные, потом проверить крайние случаи, и только потом подключать модель к обработчику. Тогда pydantic работает как страховка, а не как источник сюрпризов.
Бот помог автору за 7 дней — но рядом уже психолог и врачебный анализ
Автор сделал
Для разработчиков Telegram-ботов это хороший холодный душ. Как только продукт лезет в самочувствие, психику или здоровье, это уже не просто диалоговый интерфейс поверх модели. Завтра в таком проекте стоит проверить минимум: согласие пользователя, хранение переписок, ручной контроль специалистом, понятный стоп-сценарий и текст, где бот не изображает врача.
Самый опасный баг здесь не в промпте, а в ощущении, что «личный пет-проект» не несёт продуктовой ответственности.
Автор сделал
@freefeeltrackerbot: пишет, что бот родился из личных потребностей и «помог за 7 дней». Отдельно утверждает, что Opus 3.8 может делать «серьезный врачебный анализ», а бота он прицепил к психологу, который параллельно всё контролирует.Для разработчиков Telegram-ботов это хороший холодный душ. Как только продукт лезет в самочувствие, психику или здоровье, это уже не просто диалоговый интерфейс поверх модели. Завтра в таком проекте стоит проверить минимум: согласие пользователя, хранение переписок, ручной контроль специалистом, понятный стоп-сценарий и текст, где бот не изображает врача.
Самый опасный баг здесь не в промпте, а в ощущении, что «личный пет-проект» не несёт продуктовой ответственности.
60% медиабаинговых команд стопорят кампании не из-за креатива, а из-за карт
По данным за 2023–2024 годы, проблемы с платежными картами и транзакциями называют главной причиной остановки рекламных кампаний. Facebook и Google уже занесли сотни тысяч BIN в черные списки; AdsCard на этом фоне продвигает массовые выплаты на карты World Wide и карты для покупок с Apple Pay / Google Pay.
Если вы пишете внутренний кабинет на Django/FastAPI для баинга, платежи нельзя оставлять «в бухгалтерском углу». Минимальный слой на завтра: хранить BIN/статус транзакции/провайдера, выносить выплаты в очередь, делать алерт на рост decline-rate и не привязывать бизнес-логику к одному эмитенту.
Иначе самый красивый парсер, автозалив и отчет в ClickHouse упрётся в банальный
По данным за 2023–2024 годы, проблемы с платежными картами и транзакциями называют главной причиной остановки рекламных кампаний. Facebook и Google уже занесли сотни тысяч BIN в черные списки; AdsCard на этом фоне продвигает массовые выплаты на карты World Wide и карты для покупок с Apple Pay / Google Pay.
Если вы пишете внутренний кабинет на Django/FastAPI для баинга, платежи нельзя оставлять «в бухгалтерском углу». Минимальный слой на завтра: хранить BIN/статус транзакции/провайдера, выносить выплаты в очередь, делать алерт на рост decline-rate и не привязывать бизнес-логику к одному эмитенту.
Иначе самый красивый парсер, автозалив и отчет в ClickHouse упрётся в банальный
payment_failed.This media is not supported in your browser
VIEW IN TELEGRAM
ByteDance анонсировала новую версию SeeDance версии 2.5
ByteDance готовит релиз Seedance 2.5 — видеогенератора нового уровня. Главное улучшение: модель сможет создавать 30-секундные видео за один прогон без склеек, вместо нынешних 15 секунд. Добавили локальный монтаж отдельных кадров, поддержку 3D-болванок для управления камерой, возможность использовать до 50 референсов и генерацию в 4К сразу. Закрытый бета-тест идёт сейчас, открытый релиз ожидается в начале июля. Технологически это шаг вперёд, но д…
➡️ Читайте на сайте: https://aff.top/blog/bytedance-anonsirovala-novuiu-versiiu-seedance-versii-2-5
🧠 Ещё больше инсайтов → в канале AFF.top
ByteDance готовит релиз Seedance 2.5 — видеогенератора нового уровня. Главное улучшение: модель сможет создавать 30-секундные видео за один прогон без склеек, вместо нынешних 15 секунд. Добавили локальный монтаж отдельных кадров, поддержку 3D-болванок для управления камерой, возможность использовать до 50 референсов и генерацию в 4К сразу. Закрытый бета-тест идёт сейчас, открытый релиз ожидается в начале июля. Технологически это шаг вперёд, но д…
➡️ Читайте на сайте: https://aff.top/blog/bytedance-anonsirovala-novuiu-versiiu-seedance-versii-2-5
🧠 Ещё больше инсайтов → в канале AFF.top
This media is not supported in your browser
VIEW IN TELEGRAM
Codex уничтожит твой SSD за год
Разработчик обнаружил критический баг в Codex CLI от OpenAI: агент непрерывно записывает логи в локальную SQLite-базу, перезаписывая за 21 день 37 ТБ данных. При таком темпе типичный SSD объёмом 1 ТБ (рассчитанный на 600 ТБ перезаписей) выходит из строя менее чем за год. OpenAI осведомлена о проблеме, но пока не исправляет её. Пользователям остаётся либо ждать обновления, либо переключиться на альтернативные CLI-инструменты без подобных недостат…
➡️ Читайте на сайте: https://aff.top/blog/codex-unichtozhit-tvoi-ssd-za-god
🧠 Ещё больше инсайтов → в канале AFF.top
Разработчик обнаружил критический баг в Codex CLI от OpenAI: агент непрерывно записывает логи в локальную SQLite-базу, перезаписывая за 21 день 37 ТБ данных. При таком темпе типичный SSD объёмом 1 ТБ (рассчитанный на 600 ТБ перезаписей) выходит из строя менее чем за год. OpenAI осведомлена о проблеме, но пока не исправляет её. Пользователям остаётся либо ждать обновления, либо переключиться на альтернативные CLI-инструменты без подобных недостат…
➡️ Читайте на сайте: https://aff.top/blog/codex-unichtozhit-tvoi-ssd-za-god
🧠 Ещё больше инсайтов → в канале AFF.top
Real Python обновил квиз по email в Python — там уже не только SMTP, но и вложения с HTML
В новом квизе по Sending Emails With Python предлагают проверить, как строить письма через
Для скриптов это полезная база без лишней магии: один и тот же шаблон можно использовать для уведомлений, отчётов, инвойсов и внутренних алертов. Если у вас письма до сих пор собираются вручную строками,
Если коротко: нормальный SMTP-пайплайн в Python лучше один раз собрать правильно, чем потом чинить MIME по ночам.
В новом квизе по Sending Emails With Python предлагают проверить, как строить письма через
EmailMessage, безопасно поднимать SMTP-соединение, отправлять HTML-альтернативы и прикладывать файлы.Для скриптов это полезная база без лишней магии: один и тот же шаблон можно использовать для уведомлений, отчётов, инвойсов и внутренних алертов. Если у вас письма до сих пор собираются вручную строками,
EmailMessage — хороший повод привести это в порядок до следующего продакшн-инцидента.Если коротко: нормальный SMTP-пайплайн в Python лучше один раз собрать правильно, чем потом чинить MIME по ночам.
Python-grammar без BNF читать трудно ровно до первого разбора
Real Python выпустил квиз по BNF Notation: Dive Deeper Into Python’s Grammar.
Внутри — как читать правила грамматики Python, отличать terminals от nonterminals и разбирать BNF-фрагменты из официальной документации.
Для скриптов это быстро окупается на синтаксисе и парсинге.
Для Django и FastAPI — помогает не гадать по примерам, а понимать, почему код валится именно на уровне грамматики.
Если вы когда-то открывали docs Python и закрывали их через минуту — вот тот редкий повод вернуться и дочитать.
Real Python выпустил квиз по BNF Notation: Dive Deeper Into Python’s Grammar.
Внутри — как читать правила грамматики Python, отличать terminals от nonterminals и разбирать BNF-фрагменты из официальной документации.
Для скриптов это быстро окупается на синтаксисе и парсинге.
Для Django и FastAPI — помогает не гадать по примерам, а понимать, почему код валится именно на уровне грамматики.
Если вы когда-то открывали docs Python и закрывали их через минуту — вот тот редкий повод вернуться и дочитать.
Python MCP-сервер в Cursor: tool calls уже можно показать на живом агенте
Real Python выпустил курс по Model Context Protocol: сначала ставят MCP, разбирают client-server архитектуру и базовые сущности — prompts, resources, tools.
Дальше собирают и тестируют Python MCP server, который ходит в e-commerce данные, в том числе через симулированную базу.
Для Python-веба это полезный шаблон не «про LLM вообще», а про нормальную интеграцию сервиса и агента.
Если у вас уже есть Django/FastAPI backend, такой MCP-слой можно использовать как отдельный интерфейс к данным и внутренним операциям.
Хороший повод руками проверить, где у вас API, а где уже нужен tool-call.
Интереснее всего здесь не модель, а граница между сервером и клиентом.
Real Python выпустил курс по Model Context Protocol: сначала ставят MCP, разбирают client-server архитектуру и базовые сущности — prompts, resources, tools.
Дальше собирают и тестируют Python MCP server, который ходит в e-commerce данные, в том числе через симулированную базу.
Для Python-веба это полезный шаблон не «про LLM вообще», а про нормальную интеграцию сервиса и агента.
Если у вас уже есть Django/FastAPI backend, такой MCP-слой можно использовать как отдельный интерфейс к данным и внутренним операциям.
Хороший повод руками проверить, где у вас API, а где уже нужен tool-call.
Интереснее всего здесь не модель, а граница между сервером и клиентом.
This media is not supported in your browser
VIEW IN TELEGRAM
Google ужесточает модерацию финансовой вертикали
Google ужесточает модерацию финансовых офферов в ЕС и ЕЭЗ, введя двухэтапную верификацию через G2 Risk Solutions и Google Ads. Проверка затронет 24 страны, включая Австрию, Польшу, Нидерланды и другие члены союза. На прохождение модерации отводится 30 дней — за это время некоторые связки успеют отработать до вступления требований в силу. Для арбитражников это означает необходимость подготовиться к усложнению процесса запуска финансовых кампаний …
➡️ Читайте на сайте: https://aff.top/blog/google-uzhestochaet-moderaciiu-finansovoi-vertikali
🧠 Ещё больше инсайтов → в канале AFF.top
Google ужесточает модерацию финансовых офферов в ЕС и ЕЭЗ, введя двухэтапную верификацию через G2 Risk Solutions и Google Ads. Проверка затронет 24 страны, включая Австрию, Польшу, Нидерланды и другие члены союза. На прохождение модерации отводится 30 дней — за это время некоторые связки успеют отработать до вступления требований в силу. Для арбитражников это означает необходимость подготовиться к усложнению процесса запуска финансовых кампаний …
➡️ Читайте на сайте: https://aff.top/blog/google-uzhestochaet-moderaciiu-finansovoi-vertikali
🧠 Ещё больше инсайтов → в канале AFF.top