Flask ломается не на роутинге, а на мелочах вокруг приложения
За неделю в репах чаще всего всплывают не «сложные баги», а одни и те же промахи:
— держат глобальное состояние в модуле, а потом ловят гонки между запросами;
— тянут конфиг вручную по файлам, вместо одного объекта настроек;
— смешивают view, бизнес-логику и доступ к БД в одном обработчике.
У Flask сильная сторона — минимальный каркас. Но именно поэтому важно сразу разделить слои: route только принимает и возвращает, сервисы считают, репозитории читают и пишут. Как только логика расползается по handlers, тесты становятся дорогими, а любой рефакторинг превращается в лотерею.
Ещё одна типовая ошибка — жить на расширениях как на магии. Они удобны для auth, миграций и сессий, но если каждый пакет начинает управлять всем приложением, дебаг становится неприятным. Лучше явно собирать зависимости в фабрике приложения и передавать их туда, где они нужны. Это хорошо ложится и на unittest, и на интеграционные тесты 🧩
Если нужен Flask-проект, который переживёт не один спринт, держите простое правило: приложение должно быть маленьким, а доменная логика — независимой от Flask. Тогда смена шаблонов, БД или точки входа не сносит весь код.
За неделю в репах чаще всего всплывают не «сложные баги», а одни и те же промахи:
— держат глобальное состояние в модуле, а потом ловят гонки между запросами;
— тянут конфиг вручную по файлам, вместо одного объекта настроек;
— смешивают view, бизнес-логику и доступ к БД в одном обработчике.
У Flask сильная сторона — минимальный каркас. Но именно поэтому важно сразу разделить слои: route только принимает и возвращает, сервисы считают, репозитории читают и пишут. Как только логика расползается по handlers, тесты становятся дорогими, а любой рефакторинг превращается в лотерею.
Ещё одна типовая ошибка — жить на расширениях как на магии. Они удобны для auth, миграций и сессий, но если каждый пакет начинает управлять всем приложением, дебаг становится неприятным. Лучше явно собирать зависимости в фабрике приложения и передавать их туда, где они нужны. Это хорошо ложится и на unittest, и на интеграционные тесты 🧩
Если нужен Flask-проект, который переживёт не один спринт, держите простое правило: приложение должно быть маленьким, а доменная логика — независимой от Flask. Тогда смена шаблонов, БД или точки входа не сносит весь код.
Forwarded from AffPapa! Клуб спящих бизнесменов! Потрачено!
VELORA — новый бренд от MOTOR PARTNERS!
GEO: RU
🙂 Что получает партнер?
🔥 Станьте участником акции HOT SHARE от VELORA на эксклюзивных условиях:
🪙 Для игроков - розыгрыш 1кг золота, стоимостью в 132.000$
🪙 Для партнеров - сообщи промо PACAN и получи +10% к RS
✉️ Пиши менеджеру и начни лить трафик уже сегодня: @velora_partners
GEO: RU
✔️Новый бренд с чистой базой для эффективного старта
✔️Стабильные платежки (мин. депозит ₽100–300)
✔️Гибкие модели сотрудничества под любые источники трафика
➤ RevShare до 70%
➤ CPA до 120$
➤ Hybrid до $50 CPA + 50% RS
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from AffPapa! Клуб спящих бизнесменов! Потрачено!
This media is not supported in your browser
VIEW IN TELEGRAM
Совсем скоро запуск ШЕСТОГО проекта на RU GEO от создателей APEX, EVA, KUSH, BANDA и LEEBET!
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from AffPapa! Клуб спящих бизнесменов! Потрачено!
Там Бласк придумал сканировать/скриншотить сайты что бы мониторить размещения, по сути они нашли все сайты аффилиатов, каждый день скриншотят их и фиксируют, что бы контролировать размещения слота
ЧТо бы избежать хуйни когда менеджер раз в квартал присылает тебе один скрин "всё супер, лого стоит" — а по факту оно там провисело два дня из тридцати, и ты про это узнаёшь только когда партнёр уже слился
Пока выкатывают вроде как только Бразилию, но на очереди и другие ГЕО! Плюсы очевидны:
• смотреть на конкурентов (в Бразилии мы нашли 315 сайтов)
• смотреть, кто размещается у конкурентов
• смотреть обьем трафика
Тоже самое вайб кодить в NeBlask я не планирую, может чуть попозже, когда они все ГЕО выкатят и я смогу просто собрать все сайты котоыре они мониторят, короче если это кому надо, идем в Blask! А NeBlask подтянется позже!
P.S. На скрине - размещение бренда Bet da Sorte
ЧТо бы избежать хуйни когда менеджер раз в квартал присылает тебе один скрин "всё супер, лого стоит" — а по факту оно там провисело два дня из тридцати, и ты про это узнаёшь только когда партнёр уже слился
Пока выкатывают вроде как только Бразилию, но на очереди и другие ГЕО! Плюсы очевидны:
• смотреть на конкурентов (в Бразилии мы нашли 315 сайтов)
• смотреть, кто размещается у конкурентов
• смотреть обьем трафика
Тоже самое вайб кодить в NeBlask я не планирую, может чуть попозже, когда они все ГЕО выкатят и я смогу просто собрать все сайты котоыре они мониторят, короче если это кому надо, идем в Blask! А NeBlask подтянется позже!
P.S. На скрине - размещение бренда Bet da Sorte
Forwarded from AffPapa! Клуб спящих бизнесменов! Потрачено!
This media is not supported in your browser
VIEW IN TELEGRAM
Совсем скоро запуск ШЕСТОГО проекта на RU GEO от создателей APEX, EVA, KUSH, BANDA и LEEBET!
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Ебучий Google ADS 🤡
Media is too big
VIEW IN TELEGRAM
( Остров проклятых )
https://t.me/+_K1fUqPoJ8ExMWMy
https://t.me/+LdJ0ohSwKzQ5OWQ6
Please open Telegram to view this post
VIEW IN TELEGRAM
Starlette часто ломают не роуты, а мелкие ошибки вокруг ASGI
Starlette любят за минимализм: быстрые ответы, WebSocket, фоновые задачи, middleware. Но в бою чаще всего страдает не сам фреймворк, а обвязка вокруг него.
— Не смешивайте тяжёлую логику с endpoint: вынесите парсинг, валидацию и доступ к данным в отдельные функции.
— Не ждите чудес от sync-кода внутри async: блокирующие вызовы сразу бьют по задержкам и конкурентности.
— Не вешайте middleware «на всякий случай»: каждая прослойка добавляет стоимость на каждый запрос.
— Не игнорируйте lifespan: там удобно поднимать пул соединений, кэш и внешние клиенты, а не создавать их на каждый запрос.
Ещё одна частая ошибка — думать, что Starlette сам решит вопрос с архитектурой. Он даёт тонкий слой для ASGI, а порядок в проекте задаёте вы: схема ответов, границы модулей, обработка ошибок, логирование, таймауты.
Если нужен надёжный каркас, держите ручки тонкими, а бизнес-логику — отдельно. Тогда Starlette остаётся тем, чем и должен быть: быстрым серверным скелетом, а не местом, где живёт весь проект.
Starlette любят за минимализм: быстрые ответы, WebSocket, фоновые задачи, middleware. Но в бою чаще всего страдает не сам фреймворк, а обвязка вокруг него.
— Не смешивайте тяжёлую логику с endpoint: вынесите парсинг, валидацию и доступ к данным в отдельные функции.
— Не ждите чудес от sync-кода внутри async: блокирующие вызовы сразу бьют по задержкам и конкурентности.
— Не вешайте middleware «на всякий случай»: каждая прослойка добавляет стоимость на каждый запрос.
— Не игнорируйте lifespan: там удобно поднимать пул соединений, кэш и внешние клиенты, а не создавать их на каждый запрос.
Ещё одна частая ошибка — думать, что Starlette сам решит вопрос с архитектурой. Он даёт тонкий слой для ASGI, а порядок в проекте задаёте вы: схема ответов, границы модулей, обработка ошибок, логирование, таймауты.
Если нужен надёжный каркас, держите ручки тонкими, а бизнес-логику — отдельно. Тогда Starlette остаётся тем, чем и должен быть: быстрым серверным скелетом, а не местом, где живёт весь проект.
Forwarded from high profit — low life
⚡️ AffPapa теперь официально принадлежит Иванову
Евгений Юрьич продолжает издеваться над опозорившимся этим летом AffPapa. Вслед за базой контактов к маэстро ушел еще и товарный знак конторы...
Как проверить:
1. Перейти по ссылке
2. Ввести 2026793242
3. Ахуеть от беспомощности AffPapa
Такие сегодня новости, такая life...
High Profit — Low Life | Прислать сплетню
Евгений Юрьич продолжает издеваться над опозорившимся этим летом AffPapa. Вслед за базой контактов к маэстро ушел еще и товарный знак конторы...
Как проверить:
1. Перейти по ссылке
2. Ввести 2026793242
3. Ахуеть от беспомощности AffPapa
Такие сегодня новости, такая life...
High Profit — Low Life | Прислать сплетню
FastAPI ломается не на роутинге, а на неявных зависимостях и типах
Чаще всего проект начинает “тормозить” не из-за самого фреймворка, а из-за того, как в нём собирают сервисный слой. Если зависимость тянет БД, кэш и внешний API в одном вызове, тестировать и отлаживать это почти невозможно.
Держите базовый чек-лист:
— разделяйте endpoint, service и repository;
— выносите I/O в отдельные функции, а не в обработчик;
— для входа и выхода используйте pydantic-схемы, а не сырые dict;
— не смешивайте бизнес-логику с зависимостями через Depends, если это можно передать явно.
Ещё одна частая ошибка — считать, что async везде ускорит код. Если внутри синхронный драйвер, тяжёлый JSON или блокирующий SDK, event loop всё равно будет ждать. В таком месте лучше честно оставить sync-участок или вынести его в отдельный worker.
И последнее: держите OpenAPI и схемы ответа в порядке. Когда контракт не совпадает с реальным payload, интеграции ломаются тихо, а поиск причины занимает больше всего времени. Хороший FastAPI-проект читается не по количеству эндпоинтов, а по тому, насколько предсказуемо в нём проходят данные.
Чаще всего проект начинает “тормозить” не из-за самого фреймворка, а из-за того, как в нём собирают сервисный слой. Если зависимость тянет БД, кэш и внешний API в одном вызове, тестировать и отлаживать это почти невозможно.
Держите базовый чек-лист:
— разделяйте endpoint, service и repository;
— выносите I/O в отдельные функции, а не в обработчик;
— для входа и выхода используйте pydantic-схемы, а не сырые dict;
— не смешивайте бизнес-логику с зависимостями через Depends, если это можно передать явно.
Ещё одна частая ошибка — считать, что async везде ускорит код. Если внутри синхронный драйвер, тяжёлый JSON или блокирующий SDK, event loop всё равно будет ждать. В таком месте лучше честно оставить sync-участок или вынести его в отдельный worker.
И последнее: держите OpenAPI и схемы ответа в порядке. Когда контракт не совпадает с реальным payload, интеграции ломаются тихо, а поиск причины занимает больше всего времени. Хороший FastAPI-проект читается не по количеству эндпоинтов, а по тому, насколько предсказуемо в нём проходят данные.
Forwarded from В арбитраже денег нет?
ЕЮ Иванов продолжает кошмарить АффПапу, конторку, которая накинула говна на вентилятор этим летом. Тогда в AffPapa не знали, с каким говном идут бодаться, поэтому заслуженно проиграли. 😏
На этот раз ЕЮ зарегал товарный знак AffPapa — совсем скоро имя компании будет официально принадлежать ему. Чтобы убедиться в трушности мува, переходим по ссыл-Очке и вводим серийный номер: 2026793242. Там видим, что заявка на регистрацию подана лично Евгением Юрьичем.
Всё это выглядит забавно, но давайте не забывать, в какой сфере мы работаем и что реально может произойти с жирным троллем за воровство нейминга. Впрочем, толстому не привыкать отхватывать пиздов за проделки в интернете, поэтому ждем очередную фотку разбитого ебала и длинный пост с извинениями. 😏😏😏
В арбитраже денег нет 💵
На этот раз ЕЮ зарегал товарный знак AffPapa — совсем скоро имя компании будет официально принадлежать ему. Чтобы убедиться в трушности мува, переходим по ссыл-Очке и вводим серийный номер: 2026793242. Там видим, что заявка на регистрацию подана лично Евгением Юрьичем.
Всё это выглядит забавно, но давайте не забывать, в какой сфере мы работаем и что реально может произойти с жирным троллем за воровство нейминга. Впрочем, толстому не привыкать отхватывать пиздов за проделки в интернете, поэтому ждем очередную фотку разбитого ебала и длинный пост с извинениями. 😏😏😏
В арбитраже денег нет 💵
Copilot — релиз года или просто автодополнение на стероидах?
Copilot хорош не как «пиши за меня всё», а как ускоритель рутины: генерация шаблонов, тестов, обвязки, SQL, однотипных функций. Если относиться к нему как к junior-помощнику с хорошей памятью, он реально экономит время. Если ждать от него магии, получите красивый мусор и лишний рефакторинг.
Рабочий сценарий обычно такой:
— сначала даёте контекст: файл, стиль кода, ограничения;
— потом просите узкую задачу, а не «сделай модуль»;
— затем проверяете diff глазами, особенно edge cases и импорты;
— в конце прогоняете тесты, потому что llm любит уверенно галлюцинировать.
Где Copilot часто промахивается: скрытые зависимости, архитектурные решения, доменные правила, неочевидные побочные эффекты. Он отлично угадывает продолжение паттерна, но плохо понимает, когда паттерн вообще не нужен. Поэтому лучший режим — не автопилот, а парный разработчик, которому вы коротко объясняете задачу и сразу ставите рамки.
Если использовать Copilot как ускоритель набора, а не замену мышлению, он превращается в очень полезный dev_saas-слой поверх редактора. Но да, иногда это просто умный таб-комплит, который слишком уверенно пишет ерунду — может и не взлетит без вашего контроля.
Copilot хорош не как «пиши за меня всё», а как ускоритель рутины: генерация шаблонов, тестов, обвязки, SQL, однотипных функций. Если относиться к нему как к junior-помощнику с хорошей памятью, он реально экономит время. Если ждать от него магии, получите красивый мусор и лишний рефакторинг.
Рабочий сценарий обычно такой:
— сначала даёте контекст: файл, стиль кода, ограничения;
— потом просите узкую задачу, а не «сделай модуль»;
— затем проверяете diff глазами, особенно edge cases и импорты;
— в конце прогоняете тесты, потому что llm любит уверенно галлюцинировать.
Где Copilot часто промахивается: скрытые зависимости, архитектурные решения, доменные правила, неочевидные побочные эффекты. Он отлично угадывает продолжение паттерна, но плохо понимает, когда паттерн вообще не нужен. Поэтому лучший режим — не автопилот, а парный разработчик, которому вы коротко объясняете задачу и сразу ставите рамки.
Если использовать Copilot как ускоритель набора, а не замену мышлению, он превращается в очень полезный dev_saas-слой поверх редактора. Но да, иногда это просто умный таб-комплит, который слишком уверенно пишет ерунду — может и не взлетит без вашего контроля.
Starlette ломают не маршруты, а обработчики запросов и фоновые задачи
Starlette часто берут как «лёгкий ASGI-слой», а потом удивляются, почему приложение ведёт себя нестабильно. Главные причины обычно не в роутинге, а в том, как собраны middleware, зависимости и lifecycle.
Проверь базовый набор:
— не держи тяжёлую инициализацию в обработчике запроса;
— не запускай блокирующий I/O напрямую внутри async-кода;
— не полагайся на фоновые задачи для критичной бизнес-логики;
— не смешивай state на уровне модуля с данными конкретного запроса.
Ещё одна типовая ошибка — игнорировать границы между ASGI и синхронным кодом. Если внутри эндпоинта вызывается ORM, парсер или внешняя библиотека без обёртки, event loop начинает тормозить. Внешне это выглядит как «медленный Starlette», хотя проблема сидит в одной функции.
Хорошая схема простая: всё, что может ждать, уводишь в отдельный worker; всё, что должно отвечать быстро, оставляешь в request path; для shared-данных используешь явные объекты, а не глобальные переменные.
Если Starlette начинает «сыпаться», сначала смотри на блокировки, lifecycle и фоновые задачи — в этих трёх местах обычно спрятан реальный баг.
Starlette часто берут как «лёгкий ASGI-слой», а потом удивляются, почему приложение ведёт себя нестабильно. Главные причины обычно не в роутинге, а в том, как собраны middleware, зависимости и lifecycle.
Проверь базовый набор:
— не держи тяжёлую инициализацию в обработчике запроса;
— не запускай блокирующий I/O напрямую внутри async-кода;
— не полагайся на фоновые задачи для критичной бизнес-логики;
— не смешивай state на уровне модуля с данными конкретного запроса.
Ещё одна типовая ошибка — игнорировать границы между ASGI и синхронным кодом. Если внутри эндпоинта вызывается ORM, парсер или внешняя библиотека без обёртки, event loop начинает тормозить. Внешне это выглядит как «медленный Starlette», хотя проблема сидит в одной функции.
Хорошая схема простая: всё, что может ждать, уводишь в отдельный worker; всё, что должно отвечать быстро, оставляешь в request path; для shared-данных используешь явные объекты, а не глобальные переменные.
Если Starlette начинает «сыпаться», сначала смотри на блокировки, lifecycle и фоновые задачи — в этих трёх местах обычно спрятан реальный баг.
Python чаще ломается не в коде, а в том, как его запускают и читают
Если скрипт «вроде работает», проверь три места: входные данные, окружение и границы ошибок. В Python половина багов сидит не в алгоритме, а в том, что файл приходит пустым, переменная окружения не задана, а исключение где-то проглотили.
Для веб-проектов и автоматизации держите базовый набор привычек:
• валидируйте вход через pydantic или явные проверки;
• отделяйте чистую логику от I/O и сетевых вызовов;
• не смешивайте бизнес-правила с парсингом ответа;
• логируйте контекст ошибки, а не только текст traceback.
Отдельно следите за async: не вызывайте блокирующие библиотеки внутри event loop без обвязки, не создавайте лишние соединения в цикле и не надеетесь, что «маленькая задержка» спасёт от таймаутов. Для Django и FastAPI это особенно заметно на интеграциях, когда внешние сервисы начинают отвечать медленнее обычного.
И ещё одна вещь, которую стоит проверить в любом Python-проекте: повторяемость запуска. Если код нельзя поднять из чистого окружения по короткой инструкции, значит у вас не код, а набор удачных совпадений.
Если скрипт «вроде работает», проверь три места: входные данные, окружение и границы ошибок. В Python половина багов сидит не в алгоритме, а в том, что файл приходит пустым, переменная окружения не задана, а исключение где-то проглотили.
Для веб-проектов и автоматизации держите базовый набор привычек:
• валидируйте вход через pydantic или явные проверки;
• отделяйте чистую логику от I/O и сетевых вызовов;
• не смешивайте бизнес-правила с парсингом ответа;
• логируйте контекст ошибки, а не только текст traceback.
Отдельно следите за async: не вызывайте блокирующие библиотеки внутри event loop без обвязки, не создавайте лишние соединения в цикле и не надеетесь, что «маленькая задержка» спасёт от таймаутов. Для Django и FastAPI это особенно заметно на интеграциях, когда внешние сервисы начинают отвечать медленнее обычного.
И ещё одна вещь, которую стоит проверить в любом Python-проекте: повторяемость запуска. Если код нельзя поднять из чистого окружения по короткой инструкции, значит у вас не код, а набор удачных совпадений.
Forwarded from Natalia
ВПЕРВЫЕ! ТОЛЬКО ОДИН ВЕЧЕР!
🫥 ПИАР-ВОЙС В ЭТОМ ЧАТЕ🫥
Участников никто не знает.
Откуда они? Хуй его знает.
Темы — просто пиздец!
• Аналитика на двух лидах
• Слив анлим бюджетов
• Как просрать медийку
• Где найти нормальную работу
• Как закупиться себе в карман
⚡ Все это для тех, кто придет на ВОЙС
На котором обсудим:
Модераторы: @adv_god @natnetak
NO RESPECT CHAT • 27.08 • 19:00 GMT+3
Участников никто не знает.
Откуда они? Хуй его знает.
Темы — просто пиздец!
• Аналитика на двух лидах
• Слив анлим бюджетов
• Как просрать медийку
• Где найти нормальную работу
• Как закупиться себе в карман
Как делать PR, маркетинг и деньги в арбитраже трафика
На котором обсудим:
• На что компании еще готовы тратить деньги
• За чье внимание мы вообще конкурируем
• Что действительно работает, а что сливает бабки
• PR vs маркетинг
• Как измерить результаты кампейнов
• Что делать с запросом «хочу, чтобы про нас все знали»
Модераторы: @adv_god @natnetak
NO RESPECT CHAT • 27.08 • 19:00 GMT+3
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from AffPapa! Клуб спящих бизнесменов! Потрачено!
Иногда мне кажется, что я работаю не в iGaming, а в похоронном бюро.
Каждый день кто-то приносит очередной продукт и говорит: «У нас почему-то падает LTV.»
Потом открываешь аналитику и понимаешь, что игроки предупреждали об этом ещё месяц назад.
Просто никто не слушал.
Я — Head of Retention. И в своём канале разбираю ошибки, из-за которых команды месяцами теряют LTV, даже не замечая этого.
Каждый день кто-то приносит очередной продукт и говорит: «У нас почему-то падает LTV.»
Потом открываешь аналитику и понимаешь, что игроки предупреждали об этом ещё месяц назад.
Просто никто не слушал.
Я — Head of Retention. И в своём канале разбираю ошибки, из-за которых команды месяцами теряют LTV, даже не замечая этого.
7 ошибок в Python-скриптах, из-за которых автоматизация тихо ломается
В Python чаще всего падает не «логика», а обвязка: ввод, сеть, файлы, окружение. Скрипт может работать на одной машине и развалиться на другой, если не зафиксировать базовые правила.
— Не проверяют входные данные. Любой парсинг, CSV, JSON и ответ API надо считать грязным, пока не доказано обратное.
— Ловят Exception везде подряд. Так вы скрываете реальную причину и получаете «магическую» тишину вместо ошибки.
— Пишут в файл без атомарности. При сбое остаётся битый результат, который потом сложно отличить от валидного.
— Не разделяют бизнес-логику и I/O. Когда сеть, диск и преобразования смешаны, тестировать и чинить это больно.
Ещё одна типовая проблема — отсутствие таймаутов и повторов там, где они нужны. Любой запрос к внешнему сервису должен либо завершаться быстро, либо падать предсказуемо. Иначе один зависший вызов блокирует всю цепочку.
Если скрипт важен для денег или данных, начните не с оптимизаций, а с трёх вещей: валидация, таймауты, нормальные логи. Это дешевле, чем потом искать, почему «всё прошло без ошибок», но результат пустой.
В Python чаще всего падает не «логика», а обвязка: ввод, сеть, файлы, окружение. Скрипт может работать на одной машине и развалиться на другой, если не зафиксировать базовые правила.
— Не проверяют входные данные. Любой парсинг, CSV, JSON и ответ API надо считать грязным, пока не доказано обратное.
— Ловят Exception везде подряд. Так вы скрываете реальную причину и получаете «магическую» тишину вместо ошибки.
— Пишут в файл без атомарности. При сбое остаётся битый результат, который потом сложно отличить от валидного.
— Не разделяют бизнес-логику и I/O. Когда сеть, диск и преобразования смешаны, тестировать и чинить это больно.
Ещё одна типовая проблема — отсутствие таймаутов и повторов там, где они нужны. Любой запрос к внешнему сервису должен либо завершаться быстро, либо падать предсказуемо. Иначе один зависший вызов блокирует всю цепочку.
Если скрипт важен для денег или данных, начните не с оптимизаций, а с трёх вещей: валидация, таймауты, нормальные логи. Это дешевле, чем потом искать, почему «всё прошло без ошибок», но результат пустой.
Flask ломают не роуты, а хаос вокруг контекста и конфигов
Если проект на Flask начинает расти, самые дорогие баги обычно не в самих view-функциях. Они появляются там, где смешали конфиг, бизнес-логику и доступ к request: всё работает, пока один эндпоинт и один разработчик.
За неделю в репах чаще всего всплывают 4 вещи:
— глобальные переменные вместо app context или g;
— конфиг, собранный из os.environ прямо в модулях;
— SQL и HTTP-запросы внутри handler без слоя сервиса;
— каша из blueprints без понятных границ ответственности.
Проверка перед коммитом простая: view должна принимать request и отдавать response, а не управлять всем приложением. Конфиг — в одном месте, зависимости — через фабрику приложения, фоновые задачи — отдельно от синхронного запроса. Если код нельзя протестировать без поднятого сервера, это уже запах архитектуры.
Flask хорош там, где важны контроль и минимум магии. Но этот контроль работает только если с самого начала договориться о слоях: routing, services, storage, integrations. Тогда проект не превращается в набор скриптов с веб-обвязкой.
Если проект на Flask начинает расти, самые дорогие баги обычно не в самих view-функциях. Они появляются там, где смешали конфиг, бизнес-логику и доступ к request: всё работает, пока один эндпоинт и один разработчик.
За неделю в репах чаще всего всплывают 4 вещи:
— глобальные переменные вместо app context или g;
— конфиг, собранный из os.environ прямо в модулях;
— SQL и HTTP-запросы внутри handler без слоя сервиса;
— каша из blueprints без понятных границ ответственности.
Проверка перед коммитом простая: view должна принимать request и отдавать response, а не управлять всем приложением. Конфиг — в одном месте, зависимости — через фабрику приложения, фоновые задачи — отдельно от синхронного запроса. Если код нельзя протестировать без поднятого сервера, это уже запах архитектуры.
Flask хорош там, где важны контроль и минимум магии. Но этот контроль работает только если с самого начала договориться о слоях: routing, services, storage, integrations. Тогда проект не превращается в набор скриптов с веб-обвязкой.
7 ошибок в python-скриптах, из-за которых автоматизация ломается в самый неудобный момент
Скрипт, который «всегда работает», обычно просто ещё не получил плохой вход. В репозиториях чаще всего всплывают одни и те же проблемы:
— жёстко прошитые пути, логины, токены и URL;
— отсутствие проверок на пустой ответ и неожиданный формат;
— падение на первом же исключении без повторной попытки;
— запись результата прямо поверх исходных данных;
— отсутствие понятных логов, из-за чего непонятно, где всё сломалось.
Если скрипт ходит в сеть, добавляйте таймауты, ретраи и явную обработку 4xx/5xx. Если читает файлы — валидируйте кодировку, схему и наличие нужных колонок до основной логики. Если запускается по cron или из CI, вывод должен быть коротким, но достаточным: что обработали, сколько пропустили, на каком шаге упали.
Ещё одна типовая ловушка — смешивать бизнес-логику, I/O и форматирование отчёта в одной функции. Потом такой код невозможно тестировать и трудно переиспользовать. Разделяйте: отдельный модуль для получения данных, отдельный для обработки, отдельный для вывода. Тогда смена источника не тянет за собой переписывание всего скрипта.
Хороший скрипт не тот, который «мало кода», а тот, который переживает грязные данные и даёт понятную точку отказа.
Скрипт, который «всегда работает», обычно просто ещё не получил плохой вход. В репозиториях чаще всего всплывают одни и те же проблемы:
— жёстко прошитые пути, логины, токены и URL;
— отсутствие проверок на пустой ответ и неожиданный формат;
— падение на первом же исключении без повторной попытки;
— запись результата прямо поверх исходных данных;
— отсутствие понятных логов, из-за чего непонятно, где всё сломалось.
Если скрипт ходит в сеть, добавляйте таймауты, ретраи и явную обработку 4xx/5xx. Если читает файлы — валидируйте кодировку, схему и наличие нужных колонок до основной логики. Если запускается по cron или из CI, вывод должен быть коротким, но достаточным: что обработали, сколько пропустили, на каком шаге упали.
Ещё одна типовая ловушка — смешивать бизнес-логику, I/O и форматирование отчёта в одной функции. Потом такой код невозможно тестировать и трудно переиспользовать. Разделяйте: отдельный модуль для получения данных, отдельный для обработки, отдельный для вывода. Тогда смена источника не тянет за собой переписывание всего скрипта.
Хороший скрипт не тот, который «мало кода», а тот, который переживает грязные данные и даёт понятную точку отказа.
Forwarded from AFF.TOP - про арбитраж трафика и CPA рынок!
This media is not supported in your browser
VIEW IN TELEGRAM
В роликах Youtube теперь можно рекламировать товары Amazone
➡️ Читайте на сайте: https://aff.top/blog/v-rolikakh-youtube-teper-mozhno-reklamirovat-tovary-amazone
🧠 Ещё больше инсайтов → в канале AFF.top
➡️ Читайте на сайте: https://aff.top/blog/v-rolikakh-youtube-teper-mozhno-reklamirovat-tovary-amazone
🧠 Ещё больше инсайтов → в канале AFF.top
Forwarded from AFF.TOP - про арбитраж трафика и CPA рынок!
This media is not supported in your browser
VIEW IN TELEGRAM
Google выпустил Gemini Omni 1.1 Flash
Google обновил Gemini Omni для генерации видео: модель умеет продолжать сцены с учётом до 10 секунд контекста и собирать ролик до 40 секунд, работать по референсу и делать переходы между кадрами. Главный вывод — инструмент стал практичнее для продакшена, а посекундная цена делает его заметно доступнее для тестов и рабочих задач.
➡️ Читайте на сайте: https://aff.top/blog/google-vypustil-gemini-omni-1-1-flash
🧠 Ещё больше инсайтов → в канале AFF.top
Google обновил Gemini Omni для генерации видео: модель умеет продолжать сцены с учётом до 10 секунд контекста и собирать ролик до 40 секунд, работать по референсу и делать переходы между кадрами. Главный вывод — инструмент стал практичнее для продакшена, а посекундная цена делает его заметно доступнее для тестов и рабочих задач.
➡️ Читайте на сайте: https://aff.top/blog/google-vypustil-gemini-omni-1-1-flash
🧠 Ещё больше инсайтов → в канале AFF.top