Отправка писем в django проекте с помощью сервиса mandrill

Отправка писем в django проекте с помощью сервиса mandrill

Отправлять email сообщения с сервера можно просто по SMTP протоколу. Но есть другой способ - через специальные сервисы рассылки. Про один такой, mandrill.com, я немного расскажу.

Преимущества относительно SMTP

  • Подробная статистика отправленных писем. Сколько писем отправлено, кому, когда. Сколько писем открыли, какие ссылки нажимали.
  • Шаблоны писем. Их можно редактировать через сервис mandrill, т.о. образом не нужно ничего придумывать в админке django. В шаблоне можно использовать переменные, задавать тему письма, даже адрес отправителя. Из ...

Добавлено 2014-03-18

Что нужно знать об индексах в mongodb

Что нужно знать об индексах в mongodb

Недавно закончил курс "M101P: MongoDB for Developers" (он периодически повторяется, например следующий стартует в апреле). В процессе прохождения натолкнулся на некоторые интересные моменты.

1. Выбор индекса для запроса.

Допустим у нас коллекция с такими данными:

{ "_id" : ..., "a" : 81810, "b" : 97482, "c" : 44288 }
{ "_id" : ..., "a" : 11734, "b" : 27893, "c" : 19485 }
// и т.д.

Всего 99999 объектов. У коллекции есть индексы:

db.foo.ensureIndex({a: 1, b: 1, c: 1})
db.foo.ensureIndex({c: -1})

Вопрос: какой ...

Добавлено 2014-03-07

Асинхронный Bitcoin RPC клиент на python

Для работы с Bitcoin RPC на python'е есть библиотека Python-BitcoinRPC.

Но недавно мне понадобилось обратиться к API из приложения на tornado. Указанная библиотека работает в синхронном, т.е. блокирующем режиме. Для торнадо было бы намного лучше использовать асинхронную версию. Готовой найти не удалось, поэтому написал свой форк - асинхронный, который использует торнадовский AsyncHTTPClient: https://github.com/st4lk/python-bitcoinrpc-tornado.

Пример (выводит текущее количество блоков в сети Bitcoin):

from bitcoinrpc_async.authproxy import AsyncAuthServiceProxy
from tornado import ioloop ...

Добавлено 2014-01-30

Tornado: пример веб приложения

Tornado: пример веб приложения

Tornado - асинхронный веб фреймворк для python'а. Вначале я приведу краткий перечень плюсов и минусов tornado, а потом расскажу о типовом веб проекте с использованием этого инструмента.

Плюсы tornado

В плюсах и минусах я буду приводить свое личное ощущение по сравнению с django.

1. Асинхронность.

Торнадо представляет из себя бесконечный цикл (ioloop), который постоянно проверяет наличие событий. Все это происходит в одном потоке. К примеру кто-то обратился по адресу /home/. Допустим в качестве обработчика этого ...

Добавлено 2013-12-29

Django проект: с нуля до работающего сервера

В этом посте хочу описать свой опыт создания и запуска django проекта на VPS-хостинге.

Разделим задачу на этапы:

  1. Создание django-проекта
  2. Настройка деплоя
  3. Настройка сервера (установка нужных библиотек)
  4. Деплой проекта

Создание django-проекта

Итак. Пусть наш проект называется myproject. Создадим его на локальном компьютере. Будем считать, что python у нас в системе установлен. Для начала нам понадобятся pip и virtualenv (если еще не стоят).

Создаем виртуальное окружение:

virtualenv venv-myproject

Активируем его:

# на *nix системе
source venv-myproject/bin ...

Добавлено 2013-11-13

Настройки логов для django

Рассмотрим дефолтные настройки логов в django и попробуем их сделать максимально удобными.

Вот что есть в settings.py после команды django-admin.py startproject project_name (django 1.5):

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging ...

Добавлено 2013-09-26

Python logging на каждый день

В процессе написания программы, скрипта, часто бывает нужно вывести какую-либо отладочную информацию или сообщить о каком-то событии. Известно, что для этих целей есть встроенный модуль logging. Однако обычно у меня бывает так: времени в обрез, а все эти настройки логов (handlers, loggers, formatters и пр.) никак не могу запомнить, и на скорую руку вставляю просто print. Потом, если скрипт используется часто или его надо отдать заказчику - хочется чтобы все эти сообщения записывались в файл ...

Добавлено 2013-08-20

Кеширование queryset.count в django

Кеширование queryset.count в django

Как-то обнаружил, что у меня идут несколько одинаковых запросов вида 'SELECT COUNT(*) ...'. Оказалось (да, для меня это было новостью :) ), что метод queryset.count() в джанго кешируется по особому. Но лучше начать рассказ издалека.

Как известно, объекты queryset у ORM django являются "ленивыми", а так же кешируются.

Т.е., преподолжим у нас такая модель:

class Item(models.Model):
    name = models.CharField(max_length=50)

Тогда при создании запроса фактически обращения к БД не происходит (отсюда название lazy ...

Добавлено 2013-07-11

Форматирование unicode строк

Вы знали, что если одно из значений строкового выражения с оператором % - unicode, то вся результирующая строка будет тоже unicode?

>>> "Hello, %s" % u"Alex"
u'Hello, Alex'
>>> "Hello, %s" % u"Алексей"
u'Hello, \u0410\u043b\u0435\u043a\u0441\u0435\u0439'

Я привык пользоваться методом .format для форматирования строк и его поведение мне больше нравится: тип исходной строки всегда сохраняется, а если в качестве параметра даются не ascii символы, то возбуждается исключение UnicodeEncodeError.

>>> "Hello, {0}".format(u ...

Добавлено 2013-06-20

Парсинг url'а, содержащего unicode параметры, используя urlparse.parse_qs

Задача: получить словарь параметров URL'a. Например, имеем адрес:

http://example.com/?key=value&a=b

и нужно получить такой словарь:

{'key': ['value'], 'a': ['b']}

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

In: http://example.com/?key=value&a=b&a=c
Out: {'key': ['value'], 'a': ['b', 'c']}

В python'е для этих целей есть функция urlparse.parse_qs, которая делает следующее:

>>> import urlparse
>>> query = "key=value&a=b"
>>> urlparse ...

Добавлено 2013-05-22

Оптимизация админки django

Оптимизация админки django

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

В этом посте я рассмотрю некоторые способы уменьшения количества запросов из админки к БД при использовании __unicode__, содержащего поля связанного объекта (ForeignKey). Думаю, глядя на примеры станет понятнее ...

Добавлено 2013-04-12

Исправлена утечка памяти в Django 1.5.1

Вышло обновление Django 1.5.1 с исправлением утечки памяти и некоторыми другими фиксами. Рекомендуется обновиться.

Добавлено 2013-03-30

Функции с изменяемыми значениями по умолчанию в python'e

Python mutable default arguments

В python'е значения функции по умолчанию создаются в момент выполнения инструкции def, а не при каждом вызове функции. Если значение - неизменяемый объект (например строка, целое число, кортеж), то никаких подводных камней здесь нет. А вот если объект изменяемый (например список), то есть возможность попасть в ловушку. Вот пример:

    def foo(l=[]):
        l.append('x')
        return l

Казалось бы, при каждом вызове foo() будет возвращаться список ['x']. Но:

    >>> foo()
    ['x']
    >>> foo()
    ['x', 'x']
    >>> foo()
    ['x ...

Добавлено 2013-03-05

Многоязычный сайт на django без редиректов

Начиная с django 1.4, можно задать префикс для url для каждого включенного языка. К примеру, мы хотим сайт, который будет иметь русскую и английскую версию.

Для этого добавляем в settings.py:

    # язык сайта по умолчанию, если не удалось определить язык другими способами
    LANGUAGE_CODE = 'ru'

    # список доступных языков
    LANGUAGES = (
        ('ru', 'Russian'),
        ('en', 'English'),
    )

    # включаем систему перевода django
    USE_I18N = True

    # указываем, где лежат файлы перевода
    LOCALE_PATHS = (
        os.path.join(PROJECT_DIR, 'locale'),
    )

    # Добавляем LocaleMiddleware
    MIDDLEWARE_CLASSES = (
       # ...
       'django.middleware ...

Добавлено 2013-02-26

Обновления безопасности Django (1.3.7, 1.4.5, 1.5rc2)

Обновления не критические, но все-таки желательно обновиться. Сами исправления находятся в версиях 1.3.6, 1.4.4, 1.5rc2, но в 1.3.7, 1.4.5, 1.5rc2 устранены проблемы с обновлением.

Добавлено 2013-02-22

Скрипт для скачивания музыки вконтакте

Vkontakte audio download

Беглый поиск соответствующего скрипта на python'е не дал результов. В статье на хабре ссылка не работает. Решил написать свой велосипед, он доступен здесь.

Запуск (нужен установленный python интерпретатор):

python vkcom_audio_download.py

Проверял на python 2.6 и 2.7. Никаких дополнительных библиотек не требуется.

Принцип работы:

Скрипт проверяет сохраненный access_token. Если его нет или срок истек, то открывается страница в браузере с запросом на доступ к данным аккаунта (аудио записям). После подтверждения идет ...

Добавлено 2013-02-04

Sublime text и github gists

Sublime text and github gist

В Sublime text есть огромное количество полезных инструментов, помогающих быстро писать код. Пока я изучил лишь небольшую их часть, в том числе пытаюсь привыкнуть к Vintage mode (управление курсором в стиле vim). Но сейчас хочу рассказать о другом - об интеграции github gists с sublime text. Если вы не знаете, github gists позволяет сохранять скрипты, снипеты в виде отдельного файла, чтобы не создавать для этого целый репозиторий. При этом поддерживаются все функции репозитория - версии, возможность форка ...

Добавлено 2013-01-03

Обновления безопасности Django

Всем пользователям настоятельно рекомендуется обновить django.

Обновиться можно до версий Django 1.3.5, Django 1.4.3, и Django 1.5 beta 2.

Детали: https://www.djangoproject.com/weblog/2012/dec/10/security/.

Добавлено 2012-12-13

MobileESP: Скрипт определения мобильного устройства посетителя

Скрипт полезен, если вы хотите показывать разные версии сайта для обычных компьютеров и мобильных устройств. Большое количество методов для определения вида девайса. Доступен на разных языках программирования, включая python. Собственно порт на python был написан мной по просьбе freelance заказчика.

Так его можно использовать в django проекте:

from mobileesp import mdetect

user_agent = request.META.get("HTTP_USER_AGENT")
http_accept = request.META.get("HTTP_ACCEPT")
if user_agent and http_accept:
    agent = mdetect.UAgentInfo(userAgent=user_agent, httpAccept=http_accept)
    # устройство посетителя - новый ...

Добавлено 2012-11-29

Отладка django проекта с помощью встроенного python отладчика pdb

Я использую sublime-text в качестве редактора python кода. В нем нет встроенного отладчика, поэтому для отладки django проектов я в основном делал так:

print var_name

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

Это можно сделать с помощью встроенного python отладчика pdb:

import pdb; pdb.set_trace()

Т.е. мы вставляем эту строку в то место в коде, где ...

Добавлено 2012-11-18

Облачный сервис Openshift

Openshift логотип

Я знаю немного хостингов с бесплатным тарифом и с поддержкой python. Это Google App Engine и Alwaysdata. И вот недавно узнал про замечательный проект Openshift от RedHat, на котором и работает этот блог. Для начала небольшой обзор упомянутых хостингов.

Google app engine

Основной недостаток google app engine - ограниченный набор библиотек, которые можно использовать. Конечно, чисто python библиотеки можно ставить, но те, которые требуют C компиляции - нет. К примеру, не получится использовать pycurl. Так же на ...

Добавлено 2012-10-08

Мессенджер афоризмов

Мессенджер афоризмов

У меня есть интересный проект, которым хотел бы поделиться. Идея создать его возникла во время изучения Java. Прочел я несколько книжек, сделал маленькие программки-задания и захотелось сделать нечто большее.

Суть проекта:

Есть desktop-программа (клиент), которая сидит в трее, и периодически показывает афоризмы. Афоризмы она берет с web-сервиса (сервер), таким образом база цитат находится в одном месте. Т.е. база не привязана к клиенту, я могу обновить ее на сервере и все клиенты это заметят. У ...

Добавлено 2012-08-31

Этот сайт

Особенности:

  • работает на python+django
  • дизайн twitter bootstrap
  • в основе мой форк django-articles-transmeta блог-движка django-articles. В форке добавлена возможность перевода статей (джанго моделей)
  • работает в облаке на openshift
  • есть полнотекстовый поиск, сделан с помощью haystack + whoosh
  • многоязычность (русский и английский)
  • код лежит на github

Часто читая чужие блоги у меня мелькала мысль создать свой, но все не хватало времени взяться за это. Еще думал, что мне в нем писать? Наконец-то собрался, выделил время и вот ...

Добавлено 2012-08-28