Почти во всех крупных и средних компаниях встречаю Microsoft Exchange Web Services (EWS) в качестве сервера почты, календаря и так далее.
Совершенно недавно мне попалась задача, где нужно было получать из папки новые письма, парсить их содержимое и выносить исходя из этого содержимого решения - перенаправить их в чат, переслать на почтовый ящик, создать встречу и так далее. И тут мне повезло - в компании использовался EWS.
Поможет автоматизировать взаимодействие с ним exchangelib. Библиотека представляет из себя в основном ORM в джанговском стиле. У неё отличная документация, написаны тесты и что самое главное - для моей задачи там реализована система подписки на эвенты.
#библиотека
Совершенно недавно мне попалась задача, где нужно было получать из папки новые письма, парсить их содержимое и выносить исходя из этого содержимого решения - перенаправить их в чат, переслать на почтовый ящик, создать встречу и так далее. И тут мне повезло - в компании использовался EWS.
Поможет автоматизировать взаимодействие с ним exchangelib. Библиотека представляет из себя в основном ORM в джанговском стиле. У неё отличная документация, написаны тесты и что самое главное - для моей задачи там реализована система подписки на эвенты.
#библиотека
GitHub
GitHub - ecederstrand/exchangelib: Python client for Microsoft Exchange Web Services (EWS)
Python client for Microsoft Exchange Web Services (EWS) - ecederstrand/exchangelib
Очень хороший доклад про SQLAlchemy. Автор рассказывает о Query, состоянии запроса внутри сессии, техниках загрузок связанных таблиц, отношениях и о многих других полезных вещах.
Не смотря на то, что докладу уже 2 года, многие вещи (всё таки работа с асинком поменялась) до сих пор актуальны.
#посмотреть #sqlalchemy
Не смотря на то, что докладу уже 2 года, многие вещи (всё таки работа с асинком поменялась) до сих пор актуальны.
#посмотреть #sqlalchemy
YouTube
Денис Катаев, Tinkoff.ru «Пишем приложения на SQLAlchemy»
Конференция PYCON RUSSIA 2019
https://pycon.ru
https://pycon.ru
Сегодня пост будет об ORM'ке - piccolo, которая работает с Postgres и SQLite. А еще в асинхронщину умеет.
Отличается эта ORM от остальных тем, что внутри её огромная куча батареек - моделька юзера, аутентификация, миграции, админка и ещё многое другое.Прям как Джанга!
Прекрасно подходит, если вам нужно быстро набросать какой-то REST API. Умеет из под коробки работать с FastAPI, BlackSheep и Xpresso.
Я вот смотрю на все это многообразие и думаю - неужели Django скоро станет архаизмом?
Github | Пример с FastAPI
#библиотека
Отличается эта ORM от остальных тем, что внутри её огромная куча батареек - моделька юзера, аутентификация, миграции, админка и ещё многое другое.
Я вот смотрю на все это многообразие и думаю - неужели Django скоро станет архаизмом?
Github | Пример с FastAPI
#библиотека
GitHub
GitHub - piccolo-orm/piccolo_admin: A powerful web admin for your database.
A powerful web admin for your database. Contribute to piccolo-orm/piccolo_admin development by creating an account on GitHub.
Раз уж заговорили об ORMках, оказывается существуют ORMки (точнее ODMки, в комментариях поправили) даже для MongoDB! Одна из них, под наш любимый питон - это Beanie.
Сама библиотекапредставляет из себя очередное скрещивание ежа с ужом базирована на Motor и Pydantic, с миграциями схемы прямиком из под коробки. А ещё она асинхронная.
По опыту использования могу сказать что в некоторых случаях она не такая уж и удобная как mongoengine, в котором была нужная для меня фишка - document inheritance. Это когда вы можете наследовать классы документов без боли и со всякими удобными фишками. Например, если вам нужно посчитать все объекты Page в БД, даже которые имеются в
В базовых случаях, как по мне - всё сделано удобно, а если возникнут вопросы по использованию - можно обратиться к автору в дискорд-канал библиотеки, он действительно там сидит и отвечает на вопросы.
#библиотека
Сама библиотека
По опыту использования могу сказать что в некоторых случаях она не такая уж и удобная как mongoengine, в котором была нужная для меня фишка - document inheritance. Это когда вы можете наследовать классы документов без боли и со всякими удобными фишками. Например, если вам нужно посчитать все объекты Page в БД, даже которые имеются в
DatedPage(Page)
(да, тут DatedPage
наследует модель Page
) вы просто делаете Page.objects().count()
и они считаются. Вообще, рекомендую почитать вот это issue, там есть довольно интересное решение со стороны Pydantic.В базовых случаях, как по мне - всё сделано удобно, а если возникнут вопросы по использованию - можно обратиться к автору в дискорд-канал библиотеки, он действительно там сидит и отвечает на вопросы.
#библиотека
GitHub
GitHub - BeanieODM/beanie: Asynchronous Python ODM for MongoDB
Asynchronous Python ODM for MongoDB. Contribute to BeanieODM/beanie development by creating an account on GitHub.
Опять пост про ORM, надеюсь пока последний (хотя, кто его знает...)
Новая фича с рекомендациями репозиториев на гитхабе меня радует. Нашел вот такой cheatsheet для Django ORM, описывает пример запроса и генерируемый SQL-код. Очень полезно, если вы знаете SQL, но не знаете как выразить тот или иной запрос через Django ORM.
#ссылочки #django
Новая фича с рекомендациями репозиториев на гитхабе меня радует. Нашел вот такой cheatsheet для Django ORM, описывает пример запроса и генерируемый SQL-код. Очень полезно, если вы знаете SQL, но не знаете как выразить тот или иной запрос через Django ORM.
#ссылочки #django
🔥1
Если у вас был вопрос, как организовать очередь задач, которая умеет из под коробки в async - у меня для вас прекрасная новость.
Есть такой проект arq - это очередь задач, построенная на asyncio. Так как она асинхронная, с помощью неё можно добавлять задачи в очередь не блокируя основной поток, а сами задачи могут быть корутинами.
Либа очень маленькая, сам автор раньше контрибутил в rq. А еще, это тот же человек, который написал pydantic 👀.
#библиотека
Есть такой проект arq - это очередь задач, построенная на asyncio. Так как она асинхронная, с помощью неё можно добавлять задачи в очередь не блокируя основной поток, а сами задачи могут быть корутинами.
Либа очень маленькая, сам автор раньше контрибутил в rq. А еще, это тот же человек, который написал pydantic 👀.
#библиотека
У меня тут небольшая хотелка возникла, я захотел исходя из описаний полей в Pydantic модели генерировать запрос на выборку с фильтрацией из БД.
Оказывается, кто-то уже сделал похожее для Django. Выглядит неплохо, но всё же саму генерацию запроса я бы вынес в отдельный класс :)
#django #pydantic #eng #статья
Оказывается, кто-то уже сделал похожее для Django. Выглядит неплохо, но всё же саму генерацию запроса я бы вынес в отдельный класс :)
#django #pydantic #eng #статья
Medium
Extending Pydantic use cases with Django — Filtering
Some time ago I came across an article of a developer who was sharing his ideas about hype around usage of Pydantic library in Django…
Я нашел новый годный фреимворк, называется он Starlite, и сейчас я вам расскажу, чем он мне понравился.
Starlite - это новый, гибкий асинхронный фреимворк для API, построенный на Pydantic и Starlette. Нет, это не очередной клон FastAPI, потому что у него совершенно другая философия.
По большей части фреимворк испытал влияние NestJS, например у него в основном используются классы-контроллеры, которые уже содержат в себе роуты для сущности и всякие компоненты.
Что ещё здесь есть?
- DI. Он очень прикольный, все зависимости описываются в контроллере.
- Мидлвари построены на мидлварях Starlette и это однозначно плюс.
- Guards, это такие вызываемые функции для работы с ролями, которые управляют доступами к ресурсам.
- Плагины! Например можно сделать кастомную валидацию или парсинг входящих данных.
- DTOFactory с ремаппингом, расширением и так далее. DTO это вообще полезный паттерн, для передачи данных между подсистемами, который исключает какую либо логику в инстансе класса кроме хранения данных и их де/сериализации.
- Классы для создания тестов из под коробки.
- Кеширование ответов с выбором бекенда (есть Redis, Memcached и Etcd).
- А ещё вебсокеты, OpenAPI и многое другое!
Фреимворк очень быстрый, активно развивается, контрибуторы помогают в проблемах с ним. Фреимворк так же задает базовую структуру проекта, (например только в контроллере у тебя должны быть вьюшки для сущности), а это позволяет не "наломать дров" при попытке придумать свою структуру.
В общем, выглядит круто. Буду продолжать наблюдать.
#библиотека
Starlite - это новый, гибкий асинхронный фреимворк для API, построенный на Pydantic и Starlette. Нет, это не очередной клон FastAPI, потому что у него совершенно другая философия.
По большей части фреимворк испытал влияние NestJS, например у него в основном используются классы-контроллеры, которые уже содержат в себе роуты для сущности и всякие компоненты.
Что ещё здесь есть?
- DI. Он очень прикольный, все зависимости описываются в контроллере.
- Мидлвари построены на мидлварях Starlette и это однозначно плюс.
- Guards, это такие вызываемые функции для работы с ролями, которые управляют доступами к ресурсам.
- Плагины! Например можно сделать кастомную валидацию или парсинг входящих данных.
- DTOFactory с ремаппингом, расширением и так далее. DTO это вообще полезный паттерн, для передачи данных между подсистемами, который исключает какую либо логику в инстансе класса кроме хранения данных и их де/сериализации.
- Классы для создания тестов из под коробки.
- Кеширование ответов с выбором бекенда (есть Redis, Memcached и Etcd).
- А ещё вебсокеты, OpenAPI и многое другое!
Фреимворк очень быстрый, активно развивается, контрибуторы помогают в проблемах с ним. Фреимворк так же задает базовую структуру проекта, (например только в контроллере у тебя должны быть вьюшки для сущности), а это позволяет не "наломать дров" при попытке придумать свою структуру.
В общем, выглядит круто. Буду продолжать наблюдать.
#библиотека
GitHub
GitHub - litestar-org/litestar: Production-ready, Light, Flexible and Extensible ASGI API framework | Effortlessly Build Performant…
Production-ready, Light, Flexible and Extensible ASGI API framework | Effortlessly Build Performant APIs - litestar-org/litestar
Кто-то решил сравнить скорость работы list() vs. [], и почему что-то из вышеперечисленного быстрее. Очень занятное исследование, там так же есть про наши любимые однострочники с "list comp", почитайте.
*тык*
#статья #хабр
*тык*
#статья #хабр
Хабр
Кто быстрее создаёт списки в Python, list() или []
В процессе написания очередной программы задумался над тем, какой способ создания списков в Python работает быстрее. Большинство моих знакомых используют квадратные скобки. А некоторые совсем забыли о...
Анонсирование программы вознаграждения для urllib3
Немного слоупочная новость (неделя прошла), но всё же - у меинтейнеров появилась острая нехватка времени для допиливания urllib3 v2.0, поэтому они очень срочно ищут контрибьюторов и готовы платить от 100$ (большинство за 300$) за решение проблем и внесение фич в библиотеку. Таким образом они пытаются подогреть интерес к проекту и наконец допилить новую версию. Все награды выплачиваются через OpenCollective.
К слову, в прошлый раз они уже попытались это сделать через Твиттер, всё прошло прошло довольно неплохо, теперь пытаются расширить масштаб.
А масштаб там неплохой - как минимум хотят завести OpenSSL 3.0.
Идея звучит очень здраво - есть возможность заработать денег за вклад в опенсурс. Если интересно и найдете в себе силы - обязательно участвуйте!
Ну а если вам не жалко - можете кинуть деньги в фонд, зная что они пойду на оплату времени разработчиков.
#новости
Немного слоупочная новость (неделя прошла), но всё же - у меинтейнеров появилась острая нехватка времени для допиливания urllib3 v2.0, поэтому они очень срочно ищут контрибьюторов и готовы платить от 100$ (большинство за 300$) за решение проблем и внесение фич в библиотеку. Таким образом они пытаются подогреть интерес к проекту и наконец допилить новую версию. Все награды выплачиваются через OpenCollective.
К слову, в прошлый раз они уже попытались это сделать через Твиттер, всё прошло прошло довольно неплохо, теперь пытаются расширить масштаб.
А масштаб там неплохой - как минимум хотят завести OpenSSL 3.0.
Идея звучит очень здраво - есть возможность заработать денег за вклад в опенсурс. Если интересно и найдете в себе силы - обязательно участвуйте!
Ну а если вам не жалко - можете кинуть деньги в фонд, зная что они пойду на оплату времени разработчиков.
#новости
dataset - взаимодействие с реляционными БД для ленивых людей
Управление данными в реляционных БД имеет множество преимуществ (например организация связей), но они довольно редко используются там, где нужно просто сохранить в БД данные, чтобы потом с ними как-то работать. Из-за этого частенько данные сохраняют в CSV или JSON, но с ними в перспективе сложнее работать - обновлять в них данные или использовать поиск.
Другая проблема - изменяемость схемы данных. Постоянно нужно писать миграции если она изменилась.
Решение этих проблем - небольшая библиотека dataset. Она представляет собой обертку над SQLAlchemy, которая обеспечивает абстракцию, которая позволяет работать с реляционной БД как с NoSQL (например как с MongoDB)!
Одна из самых крутых фич в dataset - это изменение схемы налету. Вы можете записать любые данные, и если какой-то колонки в базе нет - библиотека создаст её за вас.
Всё это дело прекрасно работает с SQLite, PostgreSQL и MySQL.
GitHub | Документация
#библиотека
Управление данными в реляционных БД имеет множество преимуществ (например организация связей), но они довольно редко используются там, где нужно просто сохранить в БД данные, чтобы потом с ними как-то работать. Из-за этого частенько данные сохраняют в CSV или JSON, но с ними в перспективе сложнее работать - обновлять в них данные или использовать поиск.
Другая проблема - изменяемость схемы данных. Постоянно нужно писать миграции если она изменилась.
Решение этих проблем - небольшая библиотека dataset. Она представляет собой обертку над SQLAlchemy, которая обеспечивает абстракцию, которая позволяет работать с реляционной БД как с NoSQL (например как с MongoDB)!
Одна из самых крутых фич в dataset - это изменение схемы налету. Вы можете записать любые данные, и если какой-то колонки в базе нет - библиотека создаст её за вас.
Всё это дело прекрасно работает с SQLite, PostgreSQL и MySQL.
GitHub | Документация
#библиотека
👏6❤3
Коробка с питоном
У меня тут небольшая хотелка возникла, я захотел исходя из описаний полей в Pydantic модели генерировать запрос на выборку с фильтрацией из БД. Оказывается, кто-то уже сделал похожее для Django. Выглядит неплохо, но всё же саму генерацию запроса я бы вынес…
Помните, я тут хотел сделать "классы-фильтры", из которых бы генерировался запрос в базу с фильтрацией? Я, конечно, сделал наколеночный вариант (который крутится в проде!) и пошел искать уже готовые библиотеки. И нашел sqlalchemy-filters.
Тут всё проще - фильтры описываются в словарях. Умеет в джоины, сортировку и пагинацию. Идеально подходит для всяких REST API, поэтому если вам нужно быстрое решение - можно не заниматься велосипедостроением и воспользоваться этой библиотекой.
#библиотека
Тут всё проще - фильтры описываются в словарях. Умеет в джоины, сортировку и пагинацию. Идеально подходит для всяких REST API, поэтому если вам нужно быстрое решение - можно не заниматься велосипедостроением и воспользоваться этой библиотекой.
#библиотека
GitHub
GitHub - juliotrigo/sqlalchemy-filters: Filter, sort and paginate SQLAlchemy query objects. Ideal for exposing these actions over…
Filter, sort and paginate SQLAlchemy query objects. Ideal for exposing these actions over a REST API. - juliotrigo/sqlalchemy-filters
👏6
Гуглил как мне в Pydantic изменять входящие данные (забыл что это можно делать через валидатор) и натолкнулся на Blue Book - персональную вики одного разработчика, который пишет о различных темах - активизме, здоровье и так далее. Сейчас это обзывают модным словом Digital garden.
Но так как у нас канал о Python, и мы будем говорить о нём, у него есть небольшой раздел связанный с Python, со сниппетами, обсуждением библиотек и концепций.
Очень рекомендую заглянуть!
#ссылочки
Но так как у нас канал о Python, и мы будем говорить о нём, у него есть небольшой раздел связанный с Python, со сниппетами, обсуждением библиотек и концепций.
Очень рекомендую заглянуть!
#ссылочки
lyz-code.github.io
Digital Garden - The Blue Book
My personal digital garden
👏2
Если вы любите делать игры на Godot или хотите начать их делать, при этом разбираться с GDScript вам лень - вы можете попробовать использовать godot-python. Godot - это прекраснейший движок, чтобы начать разрабатывать игры. Как по мне выглядит получше Unity, особенно для всяких небольших мобильных игр (особенно на фоне последних новостей).
Ребята пытаются добавить поддержку скриптинга на Python в Godot, и судя по тому как развивается проект - получается это у них довольно неплохо.
Из минусов я бы выделил: странный механизм экспорта проекта, вместе с игрой вы экспортите интерпретатор питона (хотя для кого-то это не минус), отсутствие pip из под коробки - его ставить нужно отдельно.
#библиотека #gamedev
Ребята пытаются добавить поддержку скриптинга на Python в Godot, и судя по тому как развивается проект - получается это у них довольно неплохо.
Из минусов я бы выделил: странный механизм экспорта проекта, вместе с игрой вы экспортите интерпретатор питона (хотя для кого-то это не минус), отсутствие pip из под коробки - его ставить нужно отдельно.
#библиотека #gamedev
GitHub
GitHub - touilleMan/godot-python: Python support for Godot 🐍🐍🐍
Python support for Godot 🐍🐍🐍. Contribute to touilleMan/godot-python development by creating an account on GitHub.
Тут сборки PyPy для Python 3.8 и 3.9 зарелизили под маковский M1 (а если быть точнее - macOS ARM64). Отличная новость для разработчиков которые пользуются новыми макбуками!
#новости
#новости
PyPy
M1 support for PyPy
The PyPy team is happy to announce that we can now target the macOS ARM64
platform. Much of the work was executed by Maciej Fijałkowski (fijal) and
funded via a generous contribution to our OpenCollec
platform. Much of the work was executed by Maciej Fijałkowski (fijal) and
funded via a generous contribution to our OpenCollec
❤2👏1
Django 4.1 вышел! Список изменений, из интересного:
1) Асинхронный интерфейс к ORM. Под капотом выполняет
2) В CBV можно делать асинхронные методы. Подробнее тут.
3) То, чего мне не хватало - ограничения
4) Добавили команду optimizemigration которая попытается оптимизировать миграции.
#новости #django
1) Асинхронный интерфейс к ORM. Под капотом выполняет
sync_to_async()
, про лимиты и подводные камни можно почитать тут. Сделали как и предполагал, чтобы сделать асинхронный get
нужно добавить букву a
в начало - aget
, afirst
и т.д.2) В CBV можно делать асинхронные методы. Подробнее тут.
3) То, чего мне не хватало - ограничения
Check
, unique
и exclusion
проверяются во время валидации модели.4) Добавили команду optimizemigration которая попытается оптимизировать миграции.
#новости #django
❤3
Давно как-то искал как можно поднять свой pypi сервер, в итоге остановился на комплексном решении от Sonatype Nexus. На testdriven.io вышла замечательная статья, как это сделать при помощи pypiserver. Всё разворачивается в нашем с вами любимом докере :)
Github сервера
#статья
Github сервера
#статья
❤1
Нашел свежий доклад со сравнением использования CTE и SFW в Django ORM и SQLAlchemy, спойлер: джанга в такие штуки не умеет, пишите raw sql.
Ещё внезапно для себя узнал насколько алхимия мощная в плане рефлексии и как с ней легко работать используя уже существующую базу.
#посмотреть #sqlalchemy #django
Ещё внезапно для себя узнал насколько алхимия мощная в плане рефлексии и как с ней легко работать используя уже существующую базу.
#посмотреть #sqlalchemy #django
YouTube
Как Django и Alchemy (не) справляются со сложным SQL
Михаил Попугин (S7, Python-разработчик) @ Moscow Python №77
"Иногда проект перерастает Django ORM, и в игру входит SQLAlchemy. Расскажу, как каждый из них справляется (или нет) с нашей сложной бизнес-логикой. Ещё немного о том, почему мы выбрали SQLAlchemy…
"Иногда проект перерастает Django ORM, и в игру входит SQLAlchemy. Расскажу, как каждый из них справляется (или нет) с нашей сложной бизнес-логикой. Ещё немного о том, почему мы выбрали SQLAlchemy…
Нашел прекрасную утилиту которая позволяет модернизировать питонячий код - refurb.
Есть у нас вот такой код:
#утилиты
Есть у нас вот такой код:
for filename in ["file1.txt", "file2.txt"]:Refurb подсветит моменты, где код можно улучшить. Например, использовать кортежи вместо листов или выбрать более удобный метод для какой либо операции.
with open(filename) as f:
contents = f.read()
lines = contents.splitlines()
for line in lines:
if not line or line.startswith("# ") or line.startswith("// "):
continue
for word in line.split():
print(f"[{word}]", end="")
print("")
$ refurb main.pyRefurb не является тайп- или стаилчекером. Его задача - делать код лучше и не более того.
main.py:3:17 [FURB109]: Use `in (x, y, z)` instead of `in [x, y, z]`
main.py:4:5 [FURB101]: Use `y = Path(x).read_text()` instead of `with open(x, ...) as f: y = f.read()`
main.py:10:40 [FURB102]: Replace `x.startswith(y) or x.startswith(z)` with `x.startswith((y, z))`
main.py:16:9 [FURB105]: Use `print() instead of `print("")`
#утилиты
GitHub
GitHub - dosisod/refurb: A tool for refurbishing and modernizing Python codebases
A tool for refurbishing and modernizing Python codebases - dosisod/refurb
👏7❤3