Python

DRY запросы для моделей Django

Представте, что вам нужно создать музыкальную базу. Она должна включать в себя песни, альбомы и исполнителей. Причем одну и туже песню могут исполнять несколько исполнителей. В упрощенном виде мы получаем такую структуру:

from django.db import models


class Artist(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)


class Album(models.Model):
    name = models.CharField(max_length=50)
    release_date = models.DateField()


class Song(models.Model):
    artists = models.ManyToManyField(Artist)
    albums = models.ManyToManyField(Album)
    name = models.CharField(max_length=100)
    release_date = models.DateField()

Вы можете заметить, что получить информацию об исполнителях той или иной песни не просто. Предположим, нам надо получить всех исполнителей в альбоме «Lion King». Для этого вам надо выполнить следующее:

Декоратор для логирования исключений

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

Простые советы по ускорению тестов Django

TDD (Test Driven Development) полезная и удобная практика для написания качественного кода. Согласно ей вы не можете писать код, не написав предварительно тесты для него.

При TDD тесты должны запускаться как можно чаще и, следовательно, они должны отрабатывать как можно быстрее, чтоб исключить пустую потерю времени на ожидание.

В данном посте я перечислю некоторые приемы, которые помогут вам значительно ускорить выполнение тестов Django. На момент написания статьи выполнение набора из 250 тестов занимало около 5 секунд, по сравнению 50 секундами на выполнения тех же тестов, но еще не оптимизированых. Т.е. это в 10 раз быстрее.

Django: модели, инкапсуляция и целостность данных

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

Получение постов и комментариев с Facebook с помощью Python. Часть 3

В предыдущей части мы рассмотрели использование Facebook Graph API для получения постов по дате. Затем мы внесли изменения в нашу базу данных для того, чтоб иметь возможность сохранять в ней данные, полученные из Facebook Graph API.

В третьей части мы объединим все предыдущее и покажем, как получать посты и комментарии со страниц Facebook. Мы будем опираться на методы и концепции, которые были описаны в предыдущих частях. Поэтому, если вы разобрались с Частью 1 и Частью 2, то этот пост не будет для вас сложным.

Получение постов и комментариев с Facebook с помощью Python. Часть 2

В части 1 нашего урока мы стали разработчиками приложения Facebook и узнали, как делать авторизованные обращения к Graph API для получения простых данных постов и вывода их на консоль. Во второй части мы рассмотрим некоторые более сложные моменты работы с постами, например, как получить больше постов, чем возвращается на первой странице, или как найти лайки конкретного поста. Дополнительно мы расширим нашу базу данных так, чтоб мы могли собирать эти данные для дальнейшего анализа.

Получение постов и комментариев с Facebook с помощью Python. Часть 1

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

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

Отсылка почты через SMTP Яндекс.Почты в Django

С 16 сентября Яндекс Почта перешла полностью на протокол SSL для приема и отправки почты. С этого момента отправка почты через порт 25 сервера smtp.yandex.ru стало невозможным. Теперь для работы нужно подключаться к порту 465. И вот тут вылезла проблема. Стандартный SMTP бекэнд, который идет с Django не хочет подключаться. Ни с параметром use_tls, ни без него. Молча висит в ожидании чуда.

Решением стало использование своего SMTP бекэнда, который является копией стандартного с изменением всего одной строки. В строке 47 файла django.core.mail.backends.smtp.EmailBackend нужно заменить smtplib.SMTP на smtplib.SMTP_SSL.

self.connection = smtplib.SMTP_SSL(self.host, self.port,
                                   local_hostname=DNS_NAME.get_fqdn())

После этого все сразу заработало.

Версия Django: 1.6.5

Граббер публичных данных с Facebook. Часть 2

В “Граббер публичных данных Facebook. Часть 1” мы создали очень простой граббер, который получал данные с 4х страниц компаний и печатал их на консоль. Во второй части мы создадим базу данных и добавим сохранение данных, полученных скриптом, в базу данных.

Граббер публичных данных с Facebook. Часть 1

Страницы компаний и организаций на Facebook хранят тонны действительно интересной информации. Эта информация может быть чрезвычайно полезна для отслеживания эффективности страниц собственной компании c точки зрения маркетинга и администрирования страниц и/или мониторинга страниц ваших конкурентов.

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

Русские названия файлов в архивах на Mac

Периодически сталкиваюсь с проблемой при распаковке на Mac архивов, содержащих русские названия файлов. Если архив создавался на Windows, то почти наверняка навания будут в непонятной кодировке. Пробовал разные программы, но не одна из них не воспринимала их нормально. В итоге набросал маленький скриптик для zip-архивов, который сам распаковывает архив и исправляет кодировку названий.

RSA кодирование на Python

В PHP есть замечательные функции для облегчения кодирования информации. Одна из них openssl_seal, которая кодирует данные используя RC4 со случайно сгенеренным секретным ключом. В Python такой функции нету. Но можно воспользоваться пакетом M2Crypto для написания своей собственной.

Portfolio: Wok.lv

Wok.lv

WOK.lv - Бесплатная доставка китайской еды в коробочках в Риге.

Technologies: Python, Django, MySql

Использование исключений. Часть 1

Многие программистов убеждены, что исключения должны использоваться только в исключительных случаях. И они не правы. В сообществе Python убеждены, что использование исключений приводит к более чистому коду, который легче читается. Причем без огромных затрат в производительности, с которыми обычно ассоциируются исключения в других языках.

Urlize Middleware

В ходе работы с SEO потребовалось на сайте Mojalanka выделять линками различные слова и фразы. Перелапачивать каждый раз кучу статей и описаний объектов при добавлении или удалении фразы - неблагодарное занятие. Можно что-то забыть или пропустить. Да и долго это… Следовательно нужно что-то более гибкое. Тут на помощь приходят middleware Django. Они позволяют сделать обработку уже сгенерированной страницы с целью замены определенных фраз на линки. Искомые фразы, а также страницы, на которые они должны указывать, храниться в базе. К ним, конечно имеется админка, но это не тема поста, тут все просто.

Django ORM и Group By

Формирование сложных запросов с использованием Django ORM без написания SQL кода может быть не всегда очевидной вещью. Например, подсчет количества одинаковых записей в базе, отфильтрованных согласно определенному критерию. В SQL это решается просто с использованием GROUP BY и COUNT(). В Django ORM для этого имеются агрегации.

Flask, SQLAlchemy и Mysql

Переписывая сайт с картами Шри Ланки, столкнулся с забавной ошибкой Mysql: “Server has gone away”. Причем возникала она довольно часто. Сайт написан на Flask (python). Для работы с Mysql используется SQLAlchemy. Не сталкиваясь ранее с подобными вещами, немного удивился - с чего это Mysql отваливается. Как оказалось соединение просто не обновляется.

Решение - использовать пул соединений, который периодически обновляется. Для этого достаточно указать в настройках проекта количество соединений (SQLALCHEMY_POOL_SIZE) и время их жизни (SQLALCHEMY_POOL_RECYCLE), после которого они обновляются.

app = Flask(__name__)
app.config["SQLALCHEMY_POOL_SIZE"] = 5
app.config["SQLALCHEMY_POOL_TIMEOUT"] = 20
app.config["SQLALCHEMY_POOL_RECYCLE"] = 60

В данном примере пул состоит из 5 соединений, которые обновляются через 60 сек.

Portfolio: The-K-Market.com

The-K-Market.com - Хранилище образовательных видеоматериалов с возможностью заработка с помощью собственных видео уроков.

Технологии: Python, Django, MySql

Пакеты в python (дополнение)

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

Пакеты в python

Пакеты - одна из полезных и интересных возможностей Python. Особенно это востребовано в крупных проектах. Возможности пакетов огромны, но они не обязательно должны быть сложными. Однако из-за их гибкости для работы с ними надо перечитать довольно много различной информации, которая переодичечки меняется. Да еще имееются разные библиотеки (distutils, setuptools, distribute), которые решают практически одинаковые задачи.

Попробуем систематизировать информацию по созданию собственных пакетов на примере простейшего проекта “SampleProject”.

Middleware для сохранения referer url

Часто для плотной работы по продвижению сайта и работе с клиентами требуется знать откуда и по каким запросам приходят на сайт посетители. В django данная задача решается довольно тривиально - с помощью middleware.

Работа со сторонней базой данных в django

Возникла потребность получать информацию из соседнего проекта. В частности авторизовывать пользователей не по собственной базе, а по чужой. Писать отдельный API для этого не хотелось, базы находятся рядом и доступны одному пользователю. Поэтому решено было настроить модели Django поверх уже существующих таблиц. Что нам для этого потребовалось ? А потребовался отдельный роутер для базы данных. Его задача определять на какую базу отправлять запросы для каждого из приложений.

Сложные запросы в Django ORM

Задача сделать выборку списка продуктов из базы данных, цена которых находиться в некотором диапазоне, задаваемом пользователем. Сложность заключается в том, что в базе цены хранятся в различных валютах. Нет, хранить в одной валюте не подходит, т.к. курсы меняются, а пользователи из разных стран… И им удобнее оперировать со своей валютой. Итак. Поскольку кроме этого имеются еще куча фильтров для того же списка, то отказываемся от raw sql. Воспользуемся объектом Q (django.db.models.Q) из Django ORM. from django.db.models import Q

Product.objects.filter(
    Q(currency="EUR") & Q(price__gte=price_min_eur) |
    Q(currency="USD") & Q(price__gte=price_min_usd) |
    Q(currency="EUR") & Q(price__lte=price_max_eur) |
    Q(currency="USD") & Q(price__lte=price_max_usd))

В результате получаем:

SELECT *
FROM products
WHERE (currency="EUR" AND price>=%s) OR
      (currency="USD" AND price>=%s) OR
      (currency="EUR" AND price<=%s) OR
      (currency="USD" AND price<=%s)

Проверка новой почты на GMail

В меру своих возможностей я стараюсь не пользоваться лишними программами. Все эти громоздкие почтовые монстры на компьютере… Они скорее замедляют и ограничивают, чем помогают. Но это при условии постоянного доступа к инетернету. Для меня это справедливо. Так вот вся моя почта храниться, как наверное и у многих, на GMail.com. Это удобно, всегда и везде доступно и т.д. и т.д. Но столкнулся с неудобством: держать постоянно открытым окно браузера с почтой не удобно. Тем более, что у меня несколько различных ящиков: рабочий, личный, мусорный… Поэтому потребовался способ регулярной автоматической проверки почты с сообщением пользователю (т.е. мне) о новых письмах. Т.к. при переходе на Gnome 3 как-то сразу ничего готового не подвернулось, то решил оправдать высокое звание программиста и написать свой скриптик для этой цели.