Девман для питонистов
538 subscribers
157 photos
3 videos
204 links
Веб-разработка на Python. Канал от практиков.

Сайт школы Девман: https://dvmn.org/
Контакт для связи: @yulya_devman
Download Telegram
🔥В четверг мы провели онлайн-эфир на тему «Чистая архитектура: реальность или миф?»

🚀В прямом эфире разобрали:
— Что такое чистая архитектура? И существует ли она на самом деле?
— Удается ли в реальности следовать правилам чистой архитектуры?
— А как правильно? На что обращать внимание при разработке архитектуры проекта?

Делимся ссылками на видео для тех, кто не смог присутствовать:
👉YouTube
👉VK
👉RuTube

⚡️⚡️ Ставьте лайки – наберём 50 лайков на этот пост и Евгений сделает онлайн-разбор архитектуры проекта в прямом эфире!
👍7🔥4
🤔 Давайте вместе разберемся, что не так с этим кодом?
import library


def do_something():
NOTIFICATION = 'this is a global constant'
import another_library
...


def main():
do_something()
...


main()

👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана.
2
💡Если структура кода в файла нарушена, то другие программисты будут путаться в вашем коде.

💡Вложенность функций, переменных и импортов влияет на результат. Например, импорт внутри функции будет выполнен только при первом вызове этой функции, а не перед запуском main() как обычно. А переменная NOTIFICATION будет доступна только в локальной зоне видимости функции do_something().

Общая структура кода в файле должна быть такой:

— Импорты
— Объявления глобальных констант
— Объявления функций
— Остальной код, собранный в блок if name == 'main'

💡Код в нашем примере должен выглядеть так:

import library
import another_library

NOTIFICATION = "this is a global constant"


def do_something():
...


def main():
do_something()
...


if __name__ == "__main__":
main()

Тотального запрета на использование глобальных переменных нет. Но надо это делать с умом и там, где действительно нужно. Пример — объявление логгера.
🔥1
⚡️Проверяйте свои сайты! В тренде массовые проверки сайтов на наличие прав и лицензий на использование шрифтов, картинок и фотографий.

❗️Шрифты
Активизировался правообладатель FontFabric. Их дистрибьютер в РФ ООО «Компьютерные шрифты» проверяет сайты и высылает письма с требованием купить лицензию. Их созависимое юрлицо ООО «ТайпТайп» уже занимается судебными исками.

Что делать:
— Купить лицензию и жить спокойно — они вышлют отказ от претензий за использование шрифта ДО покупки лицензии;
— Сторговаться на меньшую стоимость и оплатить;
— Заменить шрифт на сайте и удалить из веб-архива, чтобы не было старых версий с коммерческим шрифтом. И надеяться, что продолжение не последует.

Если ничего не делать:
— По жалобе правообладателя провайдер будет вынужден заблокировать сайт до удаления нелицензионного шрифта
— Риск получить приглашение в суд в будущем

Как проверить: плагин для Chrome + проверить лицензию по названию

‼️Важно! Если сегодня шрифт с открытой лицензией в Google Fonts, это не значит что через год все будет также. Лицензию могут поменять. Некоторые владельцы сайтов столкнулись с тем, что 5-10 лет назад брали бесплатный шрифт, а сейчас получили претензии.

🌅Изображения
Поток судебных исков растет на использование фото со стоков. Юридические фирмы заходят к авторам и предлагают за комиссию проверить сайты и организовать процесс по консультации. Претензии подают на огромные суммы на сотни тысяч рублей. По суду получается уменьшить до 10 000 рублей, но это ещё надо уметь и иметь с кем в этот суд идти.

Недобросовестные фотографы, с которыми не были оформлены документы (оплатили работу без договора, например) также пользуются возможностью заработать.

📷Фотографии и персональные данные
Нужны письменные согласия на публикацию. Пока потока штрафов не видим, но в законах уже предусмотрены штрафы с большим количеством нулей.
👍31
⚡️⚡️ Черная пятница близко! Мы запускаем скидки на курсы!

🚀 Скидка 10% на первую ступень курса «Профессия Middle Python/Django разработчик»!

🚀 Скидка 10% на курс «FastAPI: Создаем AI генератор сайтов с нуля»!*

*Скидка распространяется на все тарифы! Количество мест для записи на тарифы PRO и VIP ограничено!

🔥Акция действует до 15 декабря! Успейте купить курсы по сниженной цене!

Чтобы воспользоваться скидкой, напишите нам в Телеграм или оставьте заявку на странице курса:
Курс «Профессия Middle Python/Django разработчик»
Курс «FastAPI: Создаем AI генератор сайтов с нуля»
🔥3😱1
🤔 Давайте вместе разберемся, что не так с этим кодом?

if __name__ == "__main__":
...
try:
if is_shorten_link(vk_token, user_url) == True:
url_clicks = count_clicks(vk_token, user_url)
...
except requests.exceptions.HTTPError as error:
...


👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана.
Сравнивать с True имеет смысл только если есть вероятность, что переменная содержит ненулевое значение, отличное от True. Сравнивать с False имеет смысл только если есть вероятность, что переменная содержит пустую коллекцию или None.

Код из нашего примера может выглядеть так:

if __name__ == "__main__":
...
try:
if is_shorten_link(vk_token, user_url):
url_clicks = count_clicks(vk_token, user_url)
...
except requests.exceptions.HTTPError as error:
...
👍1
💥Напоминаем, что Черная пятница в самом разгаре!

🚀 Скидка 10% на первую ступень курса «Профессия Middle Python/Django разработчик»!

🚀 Скидка 10% на курс «FastAPI: Создаем AI генератор сайтов с нуля»!


Скидка распространяется на все тарифы! Количество мест для записи на тарифы PRO и VIP ограничено!

🔥Акция действует до 15 декабря! Успейте купить курсы по сниженной цене!

Чтобы воспользоваться скидкой, напишите нам в Телеграм или оставьте заявку на странице курса:
Курс «Профессия Middle Python/Django разработчик»
Курс «FastAPI: Создаем AI генератор сайтов с нуля»
🔥1
🤔 Давайте вместе разберемся, что не так с этим кодом?

class ExampleClass:
def __init__(self):
self._protected_attribute = 'I am protected'

def _protected_method(self):
return 'This is a protected method'


obj = ExampleClass()
protected_method = obj._protected_method()
protected_attribute = obj._protected_attribute

👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана
✏️Одиночное подчёркивание _ — это соглашение, а не ограничение. Прямое обращение к защищённым или приватным методам/атрибутам класса извне нарушает инкапсуляцию и может привести к неожиданным последствиям.

📌Инкапсуляция — это скрытие внутренней реализации от внешнего мира с предоставлением доступа только через специально определенные, открытые методы, что повышает безопасность, надежность и управляемость кода. Это похоже на «черный ящик», где можно взаимодействовать только через «интерфейс», не зная и не вмешиваясь во внутренние детали.


✍️Возможные проблемы:
– Другие разработчики будут ожидать, что такие атрибуты/методы используются только внутри класса или его наследников.
– Если изменить логику _protected_method или имя _protected_attribute в родительском классе, то весь код, использующий их напрямую, сломается. Наследники класса могут переопределять protected-методы, но внешний код не должен от этого зависеть.
– Использование protected-элементов вне иерархии классов указывает на недостаток публичного API у класса или возможную «утечку» внутренней логики.
– Некоторые линтеры могут показывать предупреждения и код может не пройти валидацию перед мерджем, если в CI/CD настроена строгая проверка линтерами.

Для получения доступа к таким методам и атрибутам нужно создавать отдельные методы.

Код из нашего примера может выглядеть так:

class ExampleClass:
def __init__(self):
self._protected_attribute = 'I am protected'

def _protected_method(self):
return 'This is a protected method'

def get_protected_method(self):
return self._protected_method()

def get_protected_attribute(self):
return self._protected_attribute


obj = ExampleClass()
protected_method = obj.get_protected_method()
protected_attribute = obj.get_protected_attribute()
1
💥До конца Черной пятницы осталось всего три дня! Успей купить курс по выгодной цене!

🚀 Скидка 10% на первую ступень курса «Профессия Middle Python/Django разработчик»!

🚀 Скидка 10% на курс «FastAPI: Создаем AI генератор сайтов с нуля»!

Скидка распространяется на все тарифы! Количество мест для записи на тарифы PRO и VIP ограничено!

🔥Акция действует до 15 декабря! Успейте купить курсы по сниженной цене!

Чтобы воспользоваться скидкой, напишите нам в Телеграм или оставьте заявку на странице курса:
Курс «Профессия Middle Python/Django разработчик»
Курс «FastAPI: Создаем AI генератор сайтов с нуля»
В декабре ждем релиз Django 6.0. Давайте разбираться чего ждать

Какие бывают версии?
В контексте Django:

🌟LTS: Версии Django, обозначенные как LTS, получают обновления безопасности и исправления багов в течение длительного периода (обычно 3 года и более).
Например, Django 4,2, 5.2 — это LTS-версии на текущий момент. Они рекомендуются для крупных проектов, которым тяжело быстро переезжать с одной версии Django на другую.

🌟Stable: Это основные выпуски (например, 5.0, 5.1 были стабильными), которые поддерживаются до выхода следующей stable (основной) версии. Текущая стабильная версия – 5.2. Эти версии стабильны и пригодны для продакшена, но период их поддержки короче, чем у LTS (обычно 16 месяцев для обычных версий и 3 года для LTS). После выхода следующей основной версии предыдущая
продолжает получать исправления безопасности еще некоторое время, но не так долго, как LTS.

🌟Alpha: Это самые ранние версии будущего релиза. Они предназначены для тестирования новых функций и выявления багов на ранней стадии.
Нестабильны и не должны использоваться в продакшене.

🌟Beta: Более стабильны, чем альфа, но все еще могут содержать баги. Предназначены для тестирования сообществом.

🌟Release Candidate (RC): Почти готовый к выпуску стабильной версии продукт. Если в RC не находят критических багов, то он становится стабильным релизом.

🗝Ключевые особенности Django 6.0

➡️ Несовместимость с Python 3.11 и младше

Django 6.0 поддерживает Python 3.12, 3.13 и 3.14. Настоятельно рекомендуется использовать последние выпуски каждой серии. Более старые версии больше не поддерживаются. При этом по официальному опросу за прошлый год еще очень большое количество разработчиков пользуются версиями Python 3.11 и ниже в своих проектах.

➡️ Обновление политики безопасности

В Django 6.0 встроенная поддержка Политики безопасности контента.
Политика безопасности контента (Content Security Policy, CSP) в Django — это набор HTTP-заголовков, которые позволяют контролировать, какие ресурсы могут загружаться и выполняться в вашем веб-приложении, например, чтобы предотвратить атаки XSS (Cross-Site Scripting) — межсайтовый скриптинг. Django предоставляет встроенные средства для реализации CSP, например, через middleware и настройки, чтобы защитить от инъекций вредоносного контента и управлять источниками данных.

В Django 6.0, в целом, CSP продолжает работать как и ранее, но с акцентом на более строгие настройки по умолчанию и интеграцию с современными веб-технологиями, а также с использованием обновлённых middleware и улучшенной поддержкой режимов отчётов, которые помогают отслеживать нарушения.

➡️ Асинхронность и Django Tasks

Нормального асинхрона пока не предвидится. Самое ожидаемое — Django Tasks. Но это не замена Celery. Просто API, позволяющее добавлять бэкенды для работы с фоновыми задачами.

Celery — это распределенная очередь задач (distributed task queue), которая позволяет выполнять операции в фоне. Она часто используется в Django для обработки задач, которые требуют много времени или ресурсов, чтобы не блокировать основной поток веб-приложения. Типовые задачи:
— Отправка email — чтобы не заставлять пользователя ждать.
— Обработка изображений — изменение размера, фильтрация.
— Выгрузка данных — генерация отчетов в фоне.
— Интеграция с API — выполнение запросов к внешним сервисам.


Django теперь отвечает за определение и планирование задач, однако для их непосредственного выполнения вам по-прежнему потребуется внешний воркер или планировщик.
➡️ Развитие шаблонов страниц

Продолжают улучшать Django Templates. Влили библиотеку django-template-partials. Теперь не обязательно делать кучу файлов для каждого реиспользуемого блока, а можно импортировать кусок шаблона.

➡️PostgreSQL-бэкенды больше не используют CASCADE при удалении столбца.

Это означает, что при выполнении миграции, в которой удаляется колонка RemoveField, Django не будет автоматически использовать SQL-CASCADE для удаления зависимых объектов (например, связанных представлений) на уровне базы данных. Вместо этого мы теперь будем получать ошибку, что ForeignKey теперь ссылается на несуществующий столбец. Такое поведение выглядит более надежным.

❗️Это не означает, что в моделях Django работает другое поведение on_delete для ForeignKey (например, CASCADE/PROTECT и т. п. в моделях остаётся таким же, как раньше). То есть если у вас в модели стоит ForeignKey(on_delete=CASCADE), то это всё ещё применяется так же как раньше. Это изменение затрагивает внутренние механизмы миграций/SchemaEditor, а не изменение семантики on_delete в моделях.

👉 Подробное описание несовместимых изменений тут

‼️Важно! Напоминаем, что обновляться до новейшей стабильной версии на боевом проекте сразу после релиза — это плохая идея.
Девман для питонистов
⚡️⚡️Налоговая реформа 2026 близко И, казалось бы, это проблемы бизнеса, но она коснется всех нас, к сожалению. ‼️В чем суть изменений с 1 января 2026 года: — НДС почти для всех. Маленькие компании будут платить от 5%, крупным увеличат до 22%. Для тех, кто…
⚡️⚡️Мы заранее предупреждаем обо всех изменениях — без сюрпризов и мелкого шрифта.

С1 января 2026 года мы повышаем стоимость курсов.

‼️ С 1 января 2026 года ежемесячный платёж в рассрочку от школы на курс «Профессия Middle Python/Django разработчик» составит 20 000 рублей вместо 17 000 рублей!

На курсы по FastAPI поднимем цены на 15% на все тарифы. А с новостями про повышение стоимости на мини-курсы вернемся позже.

⚡️ Если вы давно откладывали старт — сейчас самое время!

Успейте приобрести курсы по старым ценам и начать путь в востребованную и современную профессию python-разработчика.

Купить курс можно здесь или напишите нам в Телеграм.

P.S. ❗️Повышение цен будет действовать только для новых учеников Профессии. Для тех, кто уже обучается или приобретет курс до 11 января включительно будет действовать старая цена!
5😱1
⚡️⚡️С 22.12.2025 мы повышаем цены на все мини-курсы на 15%!

🌟Оставляем неизменной цену только на курс «Основы Python»!

Но есть и хорошие новости! Мы сохраним текущую стоимость на мини-курсы до конца новогодних каникул — до 11 января!

🎁А на курс «Основы Python» запускаем скидку 15%! Она начнет действовать с 22.12.2025.

⚡️Успейте воспользоваться предложением до повышения цен! Дешевле уже не будет!

➡️ Выбрать и приобрести мини-курсы по старой цене можно здесь
➡️ Купить курс «Основы Python» со скидкой 15% можно
здесь

Остались вопросы? Напишите нам в Телеграм!
2😱1
🎄 Мы запускаем новогодний Python-интерактив! 🎄

До Нового года остаётся всё меньше времени — и мы решили провести его с пользой 🐍

Запускаем серию коротких интерактивных заданий для начинающих Python-разработчиков!

❄️Начнём с простого: давайте разберём, что выведет этот код?

print(True + 2025 + False * 2016 // 3)

👉Выбирайте свой вариант ответа в опросе и пишите объяснения в комментариях!
3
Что выведет код?
Anonymous Poll
73%
2026
27%
Ошибку
Девман для питонистов
🎄 Мы запускаем новогодний Python-интерактив! 🎄 До Нового года остаётся всё меньше времени — и мы решили провести его с пользой 🐍 Запускаем серию коротких интерактивных заданий для начинающих Python-разработчиков! ❄️Начнём с простого: давайте разберём…
True и False — это самые настоящие 1 и 0, для которых придумали специальные название, чтобы код было удобнее читать и понимать.

Булевые значения (тип bool) в Python — это базовые типы данных, которые могут принимать только два значения: True (истина) и False (ложь) и являются основой логических операций и управления потоком программы (например, в операторах if и циклах).

Они используются для проверки условий, а в Python не только True/False, но и другие объекты имеют «истинность» (например, ненулевые числа и непустые строки — True, ноль и пустые строки/коллекции — False), что определяется функцией bool().