Для недавно сделанного мной микросервиса shares.datagreed.ru мне захотелось отслеживать переходы по разным адресам api. Как это сделать, если Google Analytics интегрируетсяв страницу посредством JS?
Я тоже не знал. Поиск привел меня к официальной библиотеке на PHP для мобильных сайтов, на которых предполагалось не использовать яваскрипт.
Дальнейшие мои изыскания вылились в небольшую библиотеку для питона, которая позволяет использовать GA со стороны сервера. Штатно в библиотеку влючены классы для Django и Flask. Класс для Flask в данный момент развернут и полностью функционирует у меня на shares.datagreed.ru, класс для Django я пока что не тестировал.
Проект живет на здесь, в моем битбакете.
Показаны сообщения с ярлыком django. Показать все сообщения
Показаны сообщения с ярлыком django. Показать все сообщения
вторник, 6 ноября 2012 г.
понедельник, 13 августа 2012 г.
Django на uWSGI и nginx
Старые способы запуска сервера, которыми я пользовался обычно, не предполагали, что на сервере больше одного приложения, да и в принципе сейчас уже несколько архаичны. В свете того, что Django с версии 1.4 официально перешла на WSGI, я решил набросать небольшой гайд по разворачиванию приложения на связке nginx+uWSGI.
среда, 8 августа 2012 г.
Декоратор для автоматической регистрации сигналов Django
Давно наткнулся в сети на хороший сниппет, позволяющий декоратором навесить сигнал сохранения модели на метод класса модели Django. Уже и не помню, где его нашел, поэтому просто приведу чуть-чуть доработанный мной сниппет:
Пользоваться декоратором просто. Создаете модель, в ней делаете методы pre_save_handler и/или post_save_handler и оборачиваете класс декоратором:
Вот и все. pre_save_handler и post_save_handler сами вызовуться по соответствующим сигналам сохранения модели.
from functools import wraps from django.db.models.signals import pre_save from django.db.models.signals import post_save def autoconnect_signals(cls): """ Class decorator that automatically connects pre_save/post_save signals on a model class to its pre_save_handler()/post_save_handler() methods. """ def connect(signal, func): cls.func = staticmethod(func) @wraps(func) def wrapper(sender, *args, **kwargs): return func(kwargs.get('instance'), args, kwargs) signal.connect(wrapper, sender=cls) return wrapper if hasattr(cls, 'pre_save_handler'): cls.pre_save_handler = connect(pre_save, cls.pre_save_handler) if hasattr(cls, 'post_save_handler'): cls.post_save_handler = connect(post_save, cls.post_save_handler) return cls
Пользоваться декоратором просто. Создаете модель, в ней делаете методы pre_save_handler и/или post_save_handler и оборачиваете класс декоратором:
@autoconnect_signals class Book(models.Model): #... name = models.SlugField(_("Name"), max_length = 150, unique = True) def pre_save_handler(self,*args, **kwargs): u"""Сигнал, получаемый перед сохранением модели.""" print self.name #в self передается сам инстанс модели. #Остальное есть в аргументах. def post_save_handler(self,*args, **kwargs): u"""Сигнал, получаемый после сохранения модели.""" print self.name
Вот и все. pre_save_handler и post_save_handler сами вызовуться по соответствующим сигналам сохранения модели.
среда, 18 июля 2012 г.
django-paramfield
Решил выложить в паблик поле ParamField для Django, которое изначально использовалось мной в одном старом проекте, который, к сожалению, канул в лету из-за недостатка финансирования. Но поле достаточно полезное и используется мной сейчас в других проектах на Django.
Исходники и документацию можно взять в на странице проекта в bitbucket.
Расскажу вкратце об этом поле.
Исходники и документацию можно взять в на странице проекта в bitbucket.
Расскажу вкратце об этом поле.
пятница, 6 января 2012 г.
Как прожечь фид в Django
Простейший способ прожечь фид в Django 1.3+, если вдруг кому-то понадобится:
#views.py
from django.http import HttpResponseRedirect
from feeds import MyFeed
def burnedFeed(request, **kwargs):
if request.META.get('HTTP_USER_AGENT', '').startswith('FeedBurner'):
feed = MyFeed()
return feed(request)
else:
return HttpResponseRedirect('http://feeds2.feedburner.com/MyFeedName')
Где MyFeed - класс вашего фида (см. докуменатацию), где MyFeedName - правильный адрес в FeedBurner'е
#views.py
from django.http import HttpResponseRedirect
from feeds import MyFeed
def burnedFeed(request, **kwargs):
if request.META.get('HTTP_USER_AGENT', '').startswith('FeedBurner'):
feed = MyFeed()
return feed(request)
else:
return HttpResponseRedirect('http://feeds2.feedburner.com/MyFeedName')
Где MyFeed - класс вашего фида (см. докуменатацию), где MyFeedName - правильный адрес в FeedBurner'е
среда, 4 мая 2011 г.
Отправка писем с DKIM-подписью в Django
Если вы вдруг обеспокоились тем, чтобы ваши письма не попадали в черные списки почтовых сервисов и решили-таки прикрутить DKIM-подписи к своим письмам в Django, то нет ничего проще.
Начиная с версии 1.2, Django стала поддерживать почтовые backend'ы, что существенно облегчило жизнь разработчику в этом плане. Все, что требуется, так это установить pydkim и создать модуль с бекендом, например <ваше_приложение>/mail/backends.py:
Останется только сменить в settings.py параметр EMAIL_BACKEND на "<ваше_приложение>.mail.backends.DKIMBackend" и прописать там же DKIM_SELECTOR, DKIM_DOMAIN и DKIM_PRIVATE_KEY (смотрите докстринг в коде). Сгенерировать недостающие ключи можно тут.
Начиная с версии 1.2, Django стала поддерживать почтовые backend'ы, что существенно облегчило жизнь разработчику в этом плане. Все, что требуется, так это установить pydkim и создать модуль с бекендом, например <ваше_приложение>/mail/backends.py:
from django.core.mail.backends.smtp import EmailBackend from django.conf import settings import dkim class DKIMBackend(EmailBackend): u''' Бекенд, позволяющий вставлять в письма DKIM-подпись. Требует определения переменных в settings: DKIM_SELECTOR - селектор, все что до точки в "selector._domainkey.example.com" DKIM_DOMAIN - домен например, "example.com" DKIM_PRIVATE_KEY - приватный DKIM-ключ. Полностью, включая "-----BEGIN RSA PRIVATE KEY-----" и т.п. @requires: python-dkim, есть на http://hewgill.com/pydkim ''' def _send(self, email_message): if not email_message.recipients(): return False try: message_string = email_message.message().as_string() signature = dkim.sign(message_string, settings.DKIM_SELECTOR, settings.DKIM_DOMAIN, settings.DKIM_PRIVATE_KEY) self.connection.sendmail(email_message.from_email, email_message.recipients(), signature+message_string) except: if not self.fail_silently: raise return False return True
Останется только сменить в settings.py параметр EMAIL_BACKEND на "<ваше_приложение>.mail.backends.DKIMBackend" и прописать там же DKIM_SELECTOR, DKIM_DOMAIN и DKIM_PRIVATE_KEY (смотрите докстринг в коде). Сгенерировать недостающие ключи можно тут.
Подписаться на:
Сообщения (Atom)