Асинхронный Bitcoin RPC клиент на python
Для работы с Bitcoin RPC на python’е есть библиотека Python-BitcoinRPC.
Но недавно мне понадобилось обратиться к API из приложения на tornado. Указанная библиотека работает в синхронном, т.е. блокирующем режиме. Для торнадо было бы намного лучше использовать асинхронную версию. Готовой найти не удалось, поэтому написал свой форк - асинхронный, который использует торнадовский AsyncHTTPClient: https://github.com/st4lk/python-bitcoinrpc-tornado.
Tornado: пример веб приложения
Tornado - асинхронный веб фреймворк для python’а. Вначале я приведу краткий перечень плюсов и минусов tornado, а потом расскажу о типовом веб проекте с использованием этого инструмента.
Django проект: с нуля до работающего сервера
В этом посте хочу описать свой опыт создания и запуска django проекта на VPS-хостинге.
Разделим задачу на этапы:
- Создание django-проекта
- Настройка деплоя
- Настройка сервера (установка нужных библиотек)
- Деплой проекта
Настройки логов для django
Рассмотрим дефолтные настройки логов в django и попробуем их сделать максимально удобными.
Вот что есть в settings.py после команды
django-admin.py startproject project_name
(django 1.5):Python logging на каждый день
В процессе написания программы, скрипта, часто бывает нужно вывести какую-либо отладочную информацию или сообщить о каком-то событии. Известно, что для этих целей есть встроенный модуль logging. Однако обычно у меня бывает так: времени в обрез, а все эти настройки логов (handlers, loggers, formatters и пр.) никак не могу запомнить, и на скорую руку вставляю просто print. Потом, если скрипт используется часто или его надо отдать заказчику - хочется чтобы все эти сообщения записывались в файл для последующего анализа. И приходится все переделывать с использованием logging. Так вот, чтобы не держать в голове все настройки логирования, пишу этот пост с необходимыми для работы параметрами.
Кеширование queryset.count в django
Как-то обнаружил, что у меня идут несколько одинаковых запросов вида
SELECT COUNT(*) ...
. Оказалось (да, для меня это было новостью :) ), что методqueryset.count()
в джанго кешируется по особому. Но лучше начать рассказ издалека.Форматирование unicode строк
Вы знали, что если одно из значений строкового выражения с оператором
%
- unicode, то вся результирующая строка будет тоже unicode?>>> "Hello, %s" % u"Alex" u'Hello, Alex' >>> "Hello, %s" % u"Алексей" u'Hello, \u0410\u043b\u0435\u043a\u0441\u0435\u0439'
Парсинг 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']}
Оптимизация админки django
Как известно, чем меньше запросов к базе данных делает сайт, тем лучше производительность. Обычно админка - часть сайта с меньшим трафиком, но все же хорошо, если от туда не идут лишние запросы. Это и приятней в пользовании, т.к. страница отдается быстрее, и все-таки разгружает сервер.
В этом посте я рассмотрю некоторые способы уменьшения количества запросов из админки к БД при использовании
__unicode__
, содержащего поля связанного объекта (ForeignKey). Думаю, глядя на примеры станет понятнее.Функции с изменяемыми значениями по умолчанию в python'e
В python’е значения функции по умолчанию создаются в момент выполнения инструкции def, а не при каждом вызове функции. Если значение - неизменяемый объект (например строка, целое число, кортеж), то никаких подводных камней здесь нет. А вот если объект изменяемый (например список), то есть возможность попасть в ловушку. Вот пример:
def foo(l=[]): l.append('x') return l
Казалось бы, при каждом вызове foo() будет возвращаться список [‘x’]. Но:
Многоязычный сайт на django без редиректов
Начиная с django 1.4, можно задать префикс для url для каждого включенного языка. К примеру, мы хотим сайт, который будет иметь русскую и английскую версию.
Для этого добавляем в
settings.py
:Скрипт для скачивания музыки вконтакте
Беглый поиск соответствующего скрипта на python’е не дал результов. В статье на хабре ссылка не работает. Решил написать свой велосипед, он доступен здесь.
Запуск (нужен установленный python интерпретатор):
python vkcom_audio_download.py
Проверял на python 2.6 и 2.7. Никаких дополнительных библиотек не требуется.
Sublime text и github gists
В Sublime text есть огромное количество полезных инструментов, помогающих быстро писать код. Пока я изучил лишь небольшую их часть, в том числе пытаюсь привыкнуть к Vintage mode (управление курсором в стиле vim). Но сейчас хочу рассказать о другом - об интеграции github gists с sublime text. Если вы не знаете, github gists позволяет сохранять скрипты, снипеты в виде отдельного файла, чтобы не создавать для этого целый репозиторий. При этом поддерживаются многие функции репозитория - версии, возможность форка.
MobileESP: Скрипт определения мобильного устройства посетителя
Скрипт полезен, если вы хотите показывать разные версии сайта для обычных компьютеров и мобильных устройств. Большое количество методов для определения вида девайса. Доступен на разных языках программирования, включая python. Собственно порт на python был написан мной по просьбе freelance заказчика.
Отладка django проекта с помощью встроенного python отладчика pdb
Я использую sublime-text в качестве редактора python кода. В нем нет встроенного отладчика, поэтому для отладки django проектов я в основном делал так:
print var_name
и в консоле локального сервера смотрел вывод команды. Я использую этот метод и сейчас, но иногда хочется пройтись по коду по шагам, посмотреть все переменные.
Это можно сделать с помощью встроенного python отладчика pdb:
import pdb; pdb.set_trace()
Облачный сервис Openshift
Я знаю немного хостингов с бесплатным тарифом и с поддержкой python. Это Google App Engine и Alwaysdata. И вот недавно узнал про замечательный проект Openshift от RedHat, на котором и работает этот блог. Для начала небольшой обзор упомянутых хостингов.
Мессенджер афоризмов
У меня есть интересный проект, которым хотел бы поделиться. Идея создать его возникла во время изучения Java. Прочел я несколько книжек, сделал маленькие программки-задания и захотелось сделать нечто большее.