Код на салфетке
2.25K subscribers
751 photos
15 videos
2 files
793 links
Канал для тех, кому интересно программирование на Python и не только.

Сайт: https://pressanybutton.ru/
Чат: https://t.iss.one/+Li2vbxfWo0Q4ZDk6
Заметки автора: @writeanynotes

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
Django 43. Подключаем Celery и Redis для фоновой отправки почты
Автор: Иван Ашихмин

В этом посте мы добавим поддержку Celery и Redis в наш Django-проект, чтобы отправлять электронную почту в фоновом режиме.


Читать пост в Telegram

Файлы к посту, можно получить в боте по коду: 336244

Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram

#Docker #PostgreSQL #Django #Windows #Linux #Код_на_салфетке #Celery #Гайд #Docker_compose #Redis #Celery_Worker #yaml
🔥6
📚Спешим порекомендовать любопытный канал, который ведет опытный разработчик, активный спикер и организатор конференций по Python, ментор и просто интересный автор Евгений Афонасьев.

🤓 Среди постов – отчеты и видео с конференций, воспоминания об опыте разработки в разных компаниях, рекомендации интересных библиотек и многое другое. Встречаются промокоды и розыгрыши билетов на конференции.

Рекомендуем!
🔥3
Приветствуем!

Продолжаем рубрику "Вопросы и ответы"!

В течение недели вы в комментариях к этому посту можете задавать различные вопросы нашей команде. Вопросы могут быть о чём угодно (в рамках разумного): о постах, о Python, о разработке в целом.

Ровно через неделю мы подготовим пост с ответами на появившиеся вопросы.

Также у нас есть чат, в котором тоже можно задавать вопросы и просто общаться)
🔥5
Записали разбор задачи со вторника "Найди ошибку в Python коде №5"!

Ссылка на задачу.

Ссылка на видео.

Будем благодарны, если вы поставите видео лайк и досмотрите его до конца. Спасибо!
🔥3
Приветствую!

Сегодня пятница, а это значит, что настало время для нашего традиционного кинопросмотра. На этой неделе я рад представить вам фильм "Двухсотлетний человек". Эта трогательная история о роботе, который стремится стать человеком, непременно заставит вас задуматься о природе человеческой души и о том, что делает нас по-настоящему живыми. Устраивайтесь поудобнее, готовьте свои любимые закуски и наслаждайтесь этим удивительным кино.

Фильм: Двухсотлетний человек

Год: 1999

Начало нового тысячелетия; происходит прорыв в глобальных технологиях. Люди уже не заводят дома собак и кошек: они покупают себе роботов. Вот и семья Мартинов приобретает себе необычный подарок: робота нового поколения NDR-114, а в обычной жизни просто Эндрю. Купленный как прибор, запрограммированный для выполнения домашней работы, Эндрю вдруг начинает испытывать странные ощущения. Он еще не знает, что это называется чувствами.

https://www.sspoisk.ru/film/7640/

Приятного просмотра!
🔥3
В посте "AIOgram3 13. Прогноз погоды в боте - OpenWeatherMap" мы с вами добавили прогноз погоды к боту, просто так, что бы был. С тех пор "много воды утекло" и я хочу осовременить код, добавить валидацию получаемых данных и удобный к ним доступ.

Без лишних слов:

1. Создаём Pydantic-модели на основе полученного JSON:
class WeatherDescription(BaseModel):  
description: str


class WeatherMainInfo(BaseModel):
temp: float
feels_like: float
pressure: float
humidity: int


class WeatherWindInfo(BaseModel):
speed: float


class WeatherData(BaseModel):
main: WeatherMainInfo
wind: WeatherWindInfo
rain: dict | None = None
snow: dict | None = None
weather: list[WeatherDescription]


class WeatherResponse(BaseModel):
count: int
list: list[WeatherData]


2. В функции request_weather() создаём объект модели:
# ...код функции
if result.get("count"):
weather_response = WeatherResponse(**result)
return generate_result(weather_response, city)


3. Переписываем функцию generate_result() для получения данных из объекта модели:
def generate_result(data: WeatherResponse, city: str) -> str:  
weather_data = data.list[0]
rain = ("ожидается", "не ожидается")[weather_data.rain is None]
snow = ("ожидается", "не ожидается")[weather_data.snow is None]
return f"""
<b>Прогноз погоды в городе {city}</b>

Сейчас температура {weather_data.main.temp}°C
Ощущается как {weather_data.main.feels_like}°
⛅️{weather_data.weather[0].description}⛅️
💨 Скорость ветра {weather_data.wind.speed}м/с 💨
Давление {weather_data.main.pressure * 0.75} мм рт.ст.
Влажность {weather_data.main.humidity}%
💦 Дождь {rain}
❄️ Снег {snow}
"""


Полный код бота доступен в нашем репозитории для подписчиков Boosty.
🔥5👍2
Недавно познакомились с автором оригинального канала IT-Хасслер. Дима – веб-разработчик с большим стажем, всю свою карьеру активно работает над собственными пет-проектами, поэтому практикует абсолютно всё: и бэк (PHP, Node.JS, Python), и фронт (Angular, React, React Native), и даже UI/UX-дизайн.

У себя он делится собственным опытом, ошибками и лайфхаками, к примеру:

⚰️ Как он потерял два своих успешных проекта: один и второй

🧎Как лишился работы, пробовал монетизировать опыт, но ничего не получилось

😎 Как его пытались развести, но вместо этого он получил 700р

Очень рекомендуем подписаться, таких каналов сейчас крайне мало 👉 IT-Хасслер
🔥4
Django 44. Отправка электронной почты в фоновом режиме
Автор: Иван Ашихмин

В этом посте мы используем подключенный в прошлом посте Celery для отправки письма со ссылкой подтверждения регистрации в фоновом режиме.


Читать пост в Telegram

Файлы к посту, можно получить в боте по коду: 413358

Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram

#Django #Гайды #Представления #Код_на_салфетке #Celery #Redis #Шаблоны #Отправка_почты
🔥5
Привет всем!

23-го июля исполнилось ровно два года как я поступил в GeekBrains и пол года как выпустился из него. Именно с этого момента можно считать начало пути по изучению программирования, поскольку до этого были лишь мелкие, лишенные мотивации попытки.

За два года изменилось многое. По началу были прям амбиции, что вот вот, спустя всего пол года обучения, не зная ровным счётом ничего, меня возьмут работать если не в Google, то как минимум в Яндекс.

Реальность куда прозаичнее - опыт уже есть, а стабильной работы нет. Делаешь проекты, много знаешь и умеешь учиться новому, но в глазах работодателей ты зелёный джун, а им нужен "over qualified" специалист по цене интерна. И я такой не один.

Чтож, как говориться "нет худа без добра". Есть и куда двигаться, развиваться и к чему стремиться.
🔥5😭3
Приветствуем.

В прошлую пятницу мы опубликовали пост, в котором попросили вас задавать нам вопросы.

Было два вопроса: Первый в комментариях к посту, а второй в нашем YouTube канале.

Давайте на них ответим!

Ревью кода.
Ссылка на сообщение.
Ссылка на репозиторий.

Непростая задача смотреть в код направления которым ты никогда не занимался. Поэтому конкретно по коду не будет никаких советов.

Если говорить в целом, то код в файлах выглядит разрозненным и не структурированным. Первое, что бы я сделал - это представил структуру проекта в блокноте (на салфетке 😉) или в Figma/Miro. Так можно представить логически модули проекта и последовательность происходящих в нём действий.
Например:
project/
├── parser/
│ └── <файлы парсера видео>
├── recognizer/
│ └── <файлы распознавателя>
├── config/
│ ├── settings.py
│ └── <другие файлы конфигурации>
├── models/
│ └── <файлы моделей нейронок>
├── main.py
└── requirements.txt


Второе, что бы я сделал - это оформил README.md и настроил .gitignore. Расписав ридми, а именно, указав, что может программа/библиотека, как она работает, как с ней работать - лучше поймёшь проект и будет более цельное представление.

Если будут вопросы, обращайся в наш чат. Поможем и подскажем.


Несколько кнопок оплаты.
Ссылка на видео с комментарием.
Вопрос:
Здравствуйте, как вы сделали несколько кнопок оплаты с разным количеством звёзд?


Создавать кнопку оплаты можно не только используя метод .answer_invoice() у сообщения, но и через inline-клавиатуру, указывая в ней в качестве url ссылку на оплату.

При создании inline-клавиатуры, обращаясь к методу .create_invoice_link() у экземпляра бота, можно определить объект ссылки на оплату. Аргументы в ней идентичны указываемым в .answer_invoice() из поста "AIOgram3 18. Подключаем оплату Telegram Stars".

Затем при определии объекта кнопки, указываем текст на кнопке и созданную ранее ссылку:
builder.button(text=f"Поддержать канал на {i} ⭐️", url=invoice_link)


Таким образом можно сделать несколько кнопок на разную сумму.

Код реализации в нашем боте доступен подписчикам Boosty.
🔥31
Привет, друзья!

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

Отличного вам вечера и хороших выходных!

Фильм: Славные парни

Год: 2016

Что бывает, когда напарником брутального костолома становится субтильный лопух? Наемный охранник Джексон Хили и частный детектив Холланд Марч вынуждены работать в паре, чтобы распутать плевое дело о пропавшей девушке, которое оборачивается преступлением века.

https://www.kinopoisk.ru/film/841152/

https://www.ssopoisk.ru/film/841152/

Как всегда, буду рад услышать ваши впечатления и мнения о фильме в комментариях.

Приятного просмотра!
🔥5👍1
В посте "AIOgram3 16. Перевод голосовых сообщений в текст" в бота был добавлен перевод голосовых сообщений в текст используя API SpeechFlow, которое предоставляет 5 часов расшифровки в месяц.

В комментариях к посту, Timofei Ryko подсказал новый сервис - Deepgram, предоставляющий в бесплатном тарифе 200$, которого хватит примерно на 750 часов распознавания. Регистрация предельно простая. В личном кабинете получаем API-ключ, важно сохранить его сразу, т.к. он отображается всего раз.

Ссылка на сервис.

Давайте заменим старый сервис на новый в нашем боте:

1. Установим библиотеку для работы с сервисом:
pip install deepgram-sdk


2. Добавляем секретный ключ в .env и прописываем соответствующее поле в pydantic-settings-модели.

3. В функции check_message() сносим старую обработку голосового сообщения и добавляем новую:
deepgram = DeepgramClient(api_key=secrets.deepgram_key.get_secret_value())  
file = await bot.get_file(message.voice.file_id)
file_data: BytesIO = await bot.download_file(file.file_path)
payload: FileSource = {"buffer": file_data.read()}

options = PrerecordedOptions(model="nova-2", smart_format=True, language="ru-RU")

response = await deepgram.listen.asyncrest.v("1").transcribe_file(payload, options)

await message.reply(f"<pre><code>{response.results.channels[0].alternatives[0].transcript}</code></pre>")


Получаем файл голосового сообщения в буфер обмена и отправляем его в сервис. Затем полученный результат отправляем в ответ на голосовое сообщение.

Полный код бота доступен в нашем репозитории для подписчиков Boosty.
🔥41
Приветствуем!

Продолжаем рубрику "Вопросы и ответы"!

В течение недели вы в комментариях к этому посту можете задавать различные вопросы нашей команде. Вопросы могут быть о чём угодно (в рамках разумного): о постах, о Python, о разработке в целом.

Ровно через неделю мы подготовим пост с ответами на появившиеся вопросы.

Также у нас есть чат, в котором тоже можно задавать вопросы и просто общаться)
🔥4
Всем доброго вечера, друзья!

Пятница снова с нами, и это значит, что настало время для нашего еженедельного кинопросмотра. Сегодня я хочу предложить вам фильм "Малена". Эта трогательная и глубокая драма рассказывает историю юной вдовы, живущей в маленьком итальянском городке во время Второй мировой войны. Фильм затрагивает темы любви, преданности и жестокости общества, а Монника Беллуччи в главной роли просто восхитительна. Устраивайтесь поудобнее и наслаждайтесь просмотром! Желаю вам незабываемого вечера и отличных выходных!

Фильм: Малена

Год: 2000

«Мне было 13, когда я увидел ее впервые. Прошло время, я любил многих женщин, и когда мы были близки, они спрашивали: буду ли я помнить их? И я говорил: да, я буду помнить вас. Но единственная, кого я никогда не забуду - та, которая никогда не спрашивала. Малена».

https://www.sspoisk.ru/film/747/

Приятного просмотра!
🔥1
Что выведет этот код? №31
🔥3
Что выведет код с изображения? №31
Anonymous Quiz
7%
10
47%
22
0%
13
7%
11
35%
23
5%
12
🔥41
Вчерашняя задача вызвала не мало обсуждений и даже споров в нашем чате. Правильный ответ выбрали треть голосовавших. Давайте разберём, что в этой задаче не так.

Код задачи:
def outer(x):
def inner():
nonlocal x
x += 1
return x
return inner

x = 10
increment = outer(x)
x = increment() + increment()
print(x)



Разбор задачи
Создаём переменную x и присваиваем ей число 10. Назовём её x1 для ясности.
Затем создаём переменную increment, в которую помещаем вызов функции outer(x).

Функция outer принимает позиционный аргумент x, его назовём x2. Внутри находится функция inner и возврат этой функции. Именно функция inner и попадает в переменную increment.

Ниже мы перезаписываем переменную x1, помещая в неё результат сложения возвратов из функции inner.

В функции inner, используя аргумент nonlocal, мы получаем доступ к переменной x2.
Прибавляем к ней единицу и возвращаем её.

В самом конце, выводим значение переменной x1, используя функцию print().

Правильный ответ: 23.

Почему такой ответ?
Самый популярный ответ в голосовании - 22 и на первый взгляд так оно и есть, но не всё так просто.

Создав переменную increment, мы передали в функцию outer - x1 равный 10, тем самым "замкнули" это значение.

Затем при первом вызове increment() в операции сложения, значение замкнутого x2 изменился с 10 на 11 и вернули его.
При повторном вызове, значение x2 равно 11 и, добавив к нему единицу, становится - 12.

Таким образом 11 + 12 = 23.
🔥9👍1
В одном моём проекте на FastAPI используется подтверждение регистрации по электронной почте. Для создания ссылки подтверждения регистрации требуется создание токена. С этим нам поможет библиотека itsdangerous.

itsdangerous — это библиотека, созданная для обеспечения безопасности данных, передаваемых между системами в открытом виде. Она позволяет создавать криптографически защищённые подписи для данных, чтобы гарантировать их целостность и аутентичность.

Ссылка на репозиторий библиотеки: тык.

Установка библиотеки:
pip install itsdangerous


Пример создания токена:
token_serializer = URLSafeTimedSerializer(secret_key="!!!Супер_Секретный_Ключ!!!")
confirmation_token = token_serializer.dumps("Данные для шифрования, например Email пользователя")
print(confirmation_token)

>>> "ItCU0LDQvdC90YvQtSDQtNC70Y8g0YjQuNGE0YDQvtCy0LDQvdC40Y8sINC90LDQv9GA0LjQvNC10YAgRW1haWwg0L_QvtC70YzQt9C-0LLQsNGC0LXQu9GPIg.Zq50tA.njJks3T0A-gecYTcsJ8zh-VMLWs"


Создаём экземпляр класса URLSafeTimedSerializer. Данный класс создаёт токен, подходящий для передачи в URL-адресе, т.е. слагифированный и основан он на времени создания.
Затем методом .dumps создаём сам токен, передав внутрь данные для шифрования, например, email пользователя.

Пример валидации токена:
token = "ItCU0LDQvdC90YvQtSDQtNC70Y8g0YjQuNGE0YDQvtCy0LDQvdC40Y8sINC90LDQv9GA0LjQvNC10YAgRW1haWwg0L_QvtC70YzQt9C-0LLQsNGC0LXQu9GPIg.Zq50tA.njJks3T0A-gecYTcsJ8zh-VMLWs"
token_serializer = URLSafeTimedSerializer(secret_key="!!!Супер_Секретный_Ключ!!!")
try:
data = token_serializer.loads(token, max_age=3600)
except BadSignature:
print("Токен просрочен или неверный!")
print(data)

>>> "Данные для шифрования, например Email пользователя"


Обратившись к ранее созданному экземпляру класса или создав новый, передаём полученный токен в метод .loads() для расшифровки. Также у метода есть ключевой аргумент max_age, позволяющий установить срок жизни токена в секундах, например, если с создания токена прошло больше часа (3600 секунд), то сработает исключение BadSignature.
🔥4👍1