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

Сайт школы Девман: https://dvmn.org/
Контакт для связи: @yulya_devman
Download Telegram
Как работает Девман. Часть 3. Структура урока

⭐️ История. Урок Девмана — это проект. В нем всегда есть заказчик, с его историей и потребностями, и тимлид, выполняющий код-ревью. Выполнить урок — значит написать программный продукт, которым удобно пользоваться, у которого есть документация и который решает проблему заказчика.

Требования к итоговому результату возрастают постепенно. В «Основах Python» достаточно написать код с учетом требований к чистоте кода. В «API веб-сервисов» уже придется оформить репозиторий на GitHub и написать первый файл документации README.md. А своих чат-ботов и сайты на Django нужно будет дополнительно развернуть на удаленном сервере. Идеи для проектов стараемся брать из практики. Иногда разработка одного программного продукта может быть разбита на несколько уроков.

⭐️ Теория. Уроки не перегружены теорией — только необходимый минимум. В интернете доступно огромное количество теории в разных форматах и стилях на любой вкус. Читайте по теме урока статьи и книги, расширяйте свои знания и технологиях и внутреннем устройстве Python. Изучайте документацию и будьте в курсе новостей ИТ-отрасли. Умение самостоятельно искать информацию – тоже навык разработчика.

⭐️ Шаги. Новичку сложно проложить путь с нуля до цели, не заблудившись. Поэтому шаги — это маршрут, который мы уже проложили для вас, чтобы упростить задачу и ускорить прохождение. Став разработчиком, вы научитесь это делать самостоятельно. А потренироваться можно уже на командных проектах.

⭐️ Цель. Каждый шаг начинается с цели — точка маршрута, к которой надо прийти. Старайтесь держать в голове при этом основную задачу проекта, описанную в начале урока. Так меньше шансов свернуть не туда по мере прохождения. Читайте начало шага, чтобы понимать зачем и что нужно сделать. Каждый шаг решает задачу.

⭐️ Как проверить. Это список объективных критериев, по которым вы сможете самостоятельно убедиться, что шаг пройден.

⭐️ Что понадобится. Зная цель, ознакомьтесь с материалами и попробуйте применить предложенные инструменты для выполнения шага.

⭐️ Тестирование. Перед тем как отправить код на проверку, убедитесь, что он работает и соответствует заданию. Не забудьте обновить инструкции для разработчиков в документации.

⭐️ Сдача проекта. В последнем шаге нужно отправить на проверку ссылку на проект — на репозиторий GitHub. После чего вас ждёт ещё несколько итераций код-ревью и улучшений, пока все проблемы не будут устранены. Поздравляем, ещё один кейс в портфолио готов!

👉 Для тех, кто ещё не приступил к обучению на Девмане, есть возможность пройти бесплатные уроки с код-ревью из «Основ Python» и «API веб-сервисов». Или записаться на тестовый урок и пообщаться с нашими менторами.

Как работает Девман, часть 1
Как работает Девман, часть 2

➡️ Проходили онлайн-курсы? Расскажите, как было устроено ваше обучение в комментариях!
👍51
⚡️⚡️Только сегодня 11.11 и всего один день по промокоду STEPIKSALE15 вы можете купить любой курс на Stepik со скидкой 15%!

Купить наши курсы можно здесь:
👉Курс «Основы Python»
👉Курс по FastAPI
🤔 Давайте вместе разберемся, что не так с этим кодом?

def download_book(book_id, filepath=...):
...
image_relative_path = soup.find('div', class_='bookimage').find('img')['src']
image_url = urljoin(book_page_url, image_relative_path)
response = requests.get(image_url)
...
with open(filepath, 'w') as image_obj:
image_obj.write(response.content)
...
response = requests.get(book_url)
...
with open(filepath, 'w') as book:
book.write(response.text)
...

👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана.
⚡️⚡️ Завтра в 20:00 проведем онлайн-эфир на тему «Чистая архитектура: реальность или миф?»

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

🔥Мероприятие проведет Евгений Евсеев — основатель школы Devman и студии веб-разработки PelidTeam, автор методики обучения, разработчик с опытом 17+ лет

🕘Завтра (13.11, четверг) в 20:00, в формате онлайн-трансляции:
YouTube
VK (появится в группе)
RuTube

А вы пытались внедрить чистую архитектуру на своих проектах? Делитесь в комментариях, что вышло!⬇️
🔥8👍1😱1
Девман для питонистов
🤔 Давайте вместе разберемся, что не так с этим кодом? def download_book(book_id, filepath=...): ... image_relative_path = soup.find('div', class_='bookimage').find('img')['src'] image_url = urljoin(book_page_url, image_relative_path) response…
Когда блок кода перестаёт умещаться в половину экрана монитора — пора разбивать его на функции. Выберите то, что проще всего отщипнуть и поместите в отдельные функции. Также полезно разбивать и сами функции, когда в них становится слишком много строк.

В нашем примере сложно понять, что происходит в функции. Куда проще, когда ключевые действия вынесены в отдельные функции. Так будет гораздо легче читать код.

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

def download_text(book_id, filepath=...):
response = requests.get(url)
...
with open(filepath, 'w') as book_obj:
book_obj.write(response.text)


def download_image(url, folder='images/'):
response = requests.get(url)
...
with open(filepath, 'w') as image_obj:
image_obj.write(response.content)


def get_image_url(soup, book_page_url):
image_relative_path = soup.find('div', class_='bookimage').find('img')['src']
image_url = urljoin(book_page_url, image_relative_path)
return image_url


def download_book(book_id):
...
image_url = get_image_url(soup, book_page_url)
download_image(image_url)
download_text(book_url, filepath)
🔥В четверг мы провели онлайн-эфир на тему «Чистая архитектура: реальность или миф?»

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

Делимся ссылками на видео для тех, кто не смог присутствовать:
👉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 генератор сайтов с нуля»