SQLALchemy vs Django ORM
Если большую часть времени вы работаете с Django ORM и вам надо перейти на SQLALchemy - то вы встретите ряд концептуальных отличий. В этом посте опишу часть из них, на мой взгляд заметных больше всего.
Все примеры для SQLAlchemy буду приводить в асинхронном коде, в контексте PostgreSQL. Версия Django - 4.2, SQLALchemy - 2.0.
Полные примеры можно найти тут https://github.com/st4lk/sqlalchemy-vs-django-orm, в тексте для краткости код приведен не полностью.
Sublime Text и Language Server Protocol
Language Server Protocol (LSP)
Language Server Protocol (LSP) - протокол для общения между IDE и языковым сервером. Сервер предоставляет такие функции, как автокомплит, переход к функции (goto) и прочее. Т.е. когда IDE нужно показать автокомплит на языке, скажем, python - происходит запрос к специальному серверу. В ответе возвращаются необходимые данные, которые IDE уже может отобразить. Радует то, что это инициатива крупной компании - Microsoft.
Ловушка при подсчете связанных объектов в Django
Задача: для каждого объекта подсчитать количество связанных объектов, удовлетворяющих определенному условию.
Django: сигнал или метод модели?
Когда нужно написать какой-либо функционал, который должен быть выполнен при сохранении django модели, у меня всегда возникал вопрос - где его лучше реализовать. В сигнале или в методе
save()
модели? Давайте разберемся, что и в каких ситуациях более удобно.Пробуем JSON в Django и PostgreSQL (и сравниваем с MongoDB)
В Django 1.9 будет добавлено поле JSONField, его можно использовать с базой данных PostgreSQL >= 9.4. Давайте попробуем с ним поработать и оценить, насколько оно удобно.
OAuth и django rest framework
Тема избитая, но мне не удалось найти готового решения, которое полностью бы меня устроило. Поэтому пишу сам :).
Итак, у нас есть “одностраничный” веб сайт, который общается с бекендом посредством REST API. Клиентская часть может быть написана с помощью ember, angularjs или чего-то подобного. Бекенд - django rest framework (DRF). И есть тривиальная задача - добавить вход через социальные сети (OAuth протокол).
Tornado and pgettext
Недавно (26 мая 2015 года) вышел релиз tornado 4.2. В него вошли разные дополнения, пожалуй основные из них - модули tornado.locks и tornado.queues. Они перекочевали из пакета Toro, подробное описание процесса от Jesse Jiryu Davis в его блоге.
Здесь же хочу рассказать о другой маленькой функции, которая была добавлена с моей помощью - pgettext.
OAuth step by step
OAuth протокол бывает двух версий: 1.0 и 2.0.
Большинство сервисов сегодня используют версию 2.0, вероятно потому что ее проще реализовать. Так же версию 2.0 можно относительно безопасно использовать в standalone-приложениях (те, которые без сервера).
Для понимания протоколов очень полезно взглянуть на их реализацию. Тут я приведу несколько скриптов, которые общаются с OAuth-провайдерами разных версий. Т.е. все скрипты реализуют функционал клиента (не сервера). Используются только стандартные python библиотеки. Вот почему глядя на них лучше понимаешь сам протокол OAuth - все перед глазами и все более-менее знакомое. Конечно, для реальной работы нужно использовать только готовые и проверенные временем пакеты. Эти скрипты только для понимания процесса. Разбираться с готовыми библиотеками порой бывает сложно, они разбиты на много модулей, могут использоваться разные сторонние пакеты, и в итоге общая картина ускользает из виду.
Python tips & tricks
Недавно прочитал книгу Марка Лутца “Learning Python”, 5-ое издание. Привожу список самых интересных фишек (по моему мнению) оттуда, что-то вроде конспекта.
Слушаем wifi с помощью wireshark
Всегда знал, что можно посмотреть сетевые пакеты, которые передаются по wifi сети. Но на практике этого не делал (на работе анализировал сетевые пакеты, но то был не HTTP протокол). Решил восполнить этот пробел, ведь это интересно и полезно. Более стройно выстраивается понимание протоколов TCP-IP и HTTP. Видно, как летят наши пароли и сессии, после такого опыта поневоле начинаешь относиться к безопасности сайта с большим трепетом.
Отладка SQL в django тестах
В django тестах можно замерять количество сделанных SQL запросов:
def test_home(self): with self.assertNumQueries(1): response = self.client.get('/') self.assertEqual(response.status_code, 200)
Если код в контексте
assertNumQueries
сделает иное количество обращений к БД, чем ожидается (здесь 1), то тест выдает ошибку. Но когда такой тест не проходит, бывает трудно определить лишний отправленный запрос. Для отладки такого случая удобно вывести в консоль отправленные SQL запросы. Далее опишу, как этого добиться.Tornado i18n и l10n
Статья о том, что такое i18n и i10n и как это реализовать в приложении на tornado. Получилось довольно много букв, но хотелось рассказать доступно обо всем процессе. Сама пошаговая инструкция - во второй половине статьи.
Timestamp и ObjectId в mongoDB
У каждой записи в mongoDB есть поле
_id
, которое должно быть уникальным в коллекции. По умолчанию тип этого поля - ObjectId, и оно присваивается автоматически, если поле не заполнено при сохранении.Давайте рассмотрим, что из себя представляет тип ObjectId.
Задание url для обработчиков Tornado
В tornado, для привязки обработчиков к url’ам, можно передать список из кортежей
(url regex, handler)
при инициализации приложения:application = tornado.web.Application([ (r"/", MainHandler), (r"/some/path/page/(?P<pk>[0-9]+)$", PageHandler), ])
Но не секрет, что гораздо удобнее использовать обертку
tornado.web.url
, которая позволяет присваивать имена для путей (похожа на django’вский url).Подключение celery к django
Для подключения celery к новому проекту так или иначе приходится подглядывать в предыдущие, чтобы вспомнить необходимые шаги: какие настройки задавать, как запускать, как останавливать и т.д.
Хочу собрать все в одном месте.
Вложенные SQL запросы в Django
Вы знали, что Django ORM умеет делать вложенные SQL запросы? К своему стыду я узнал это не так давно.
Бесплатная футболка от New Relic
New Relic - сервис для мониторинга веб приложения. Позволяет в подробных деталях смотреть статистику работы, где программа тратит больше всего времени, как часто обращается к базе данных и много всего прочего. Для описания этого прекрасного сервиса следует уделить отдельный пост. Здесь же хочу рассказать о другом - как я получил бесплатную футболку от New Relic.
На самом деле, для этого нужно лишь зарегистрироваться и настроить New Relic на работающем сайте. Как и сказано в их предложении.
Внешний url для localhost сервера
Есть замечательная тулза под названием ngrok. Она позволяет привязать URL для вашего localhost сервера!
Отправка писем в django проекте с помощью сервиса mandrill
Отправлять email сообщения с сервера можно просто по SMTP протоколу. Но есть другой способ - через специальные сервисы рассылки. Про один такой, mandrill.com, я немного расскажу.
Что нужно знать об индексах в mongodb
Недавно закончил курс “M101P: MongoDB for Developers” (он периодически повторяется, например следующий стартует в апреле). В процессе прохождения натолкнулся на некоторые интересные моменты.