Subscribe

Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 13Sep

    Развел небольшой холивар на своем любимом блоге.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 01Aug

    с утра зашел проверить утренние филы. И вот наткнулся celery. Теперь тяжеловесные задачи на откладывать на потом. И делается это очень просто, по крайне мене судя по документации. Тут более подроная апишка.

    Оставил себе таск на выходные порытся и тут. Обо всем напишу тут.

    PS: первое, к чему бы я сразу это прикрутил – это отсылка мыла. Ее всегда полезно отложить :)

    Всем удачных выходных.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , , , , ,

  • 29Jul

    только что наткнулся на этот “АП”, хотя на самом деле – это такой сборничек маленьких полезных функций и пары декораторов. В принфипе ничего сверхестественного. Но смотреть всем обязательно.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 24Jun

    Пока мой ноут еще жив, а читатели делают ставки, я решил перед сном еще расковырять django-debug-tolbar.

    По сути все панели построены на хаках. Т.е. В архитектуре самого движка не закладывалась такая фишка. Т.е. К примеру берут класс BaseCache для из модуля django.core.cache.backends.base делают на его основе наследника, который делает тоже самое, только еще и считает. И заменяют полученный класс в модуле. Т.е. теперь там лежит «тулбарный» класс, и джанго для своей кухни будет брать его, а он уже будет делать свои «темные делишки».

    Я для своего csvlog выкавырял оттуда только sql. Теперь я могу еще и вести лог всех запросов, проходящих в вашем апе, и говорить, сколько времени они съели. Сделал сразу компонентную структуру, почти как у этого самого тулбара, так что если что можете отключать.

    А хак этот выглядит совсем не сложно:

    1. from django.db.backends import util
    2. import time
    3. from csvlog.middleware import glog
    4. class DatabaseStatTracker(util.CursorDebugWrapper):
    5.     def execute(self, sql, params=()):
    6.         start = time.time()
    7.         try:
    8.             return self.cursor.execute(sql, params)
    9.         finally:
    10.             stop = time.time()
    11.             glog.dbg(['__SQL__',stop-start,sql,unicode(params)])
    12. util.CursorDebugWrapper = DatabaseStatTracker

    Да, и я не тестил, но очень сильно подозреваю, что теперь кто-то из них двоих не сможет считать сюелины, и скорее всего тот, чей ап идет позже в INSTALLED_APPS.

    PS: Забыл предварительно проверить свободное место на винте. Бедняга должен умереть свободным.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 22Jun

    Исправил много мелких багов, но надо уже написать нормальную доку. Есть еще идея, взять кусочки из джанго тулбара и к примеру дать возможность выводить все СЮЛ запросы.

    Кроме того, сейчас пишу еще одно приложения – простое для принятия платежей. Хотя, получилась довольно универсальная фишка. Так вот в нем я использую эти логи, но есть вероятность, хотя и маленькая, но есть, что комуто логи эти будут не подуше, поетому я еще и заглушку сделал. Такие заглушки можно писать для взаимодейстивя между джанго приложений.

    В папку с аппом добовляем файлик extapp.py

    1. __all__ = ['glog']
    2. from django.conf import settings
    3. if 'csvlog' in  settings.INSTALLED_APPS:
    4.     from csvlog import glog
    5. else:
    6.     class glog():
    7.         @staticmethod
    8.         def get_log_func(self,*args):
    9.             return lambda *args:None
    10.     for n in ['err','imp','inf','log','trc','dbg']:
    11.         setattr(glog,n,staticmethod(lambda *args:None))

    проверяет есть ли апп, если нет, то пишем для него заглушку. А везде в коде просто юзаем

    1. from extapp import glog

    I love Python!

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 17Jun

    Когда делая выборку из объекта родителя и хочется получать объекты наследники, то я использую такой финт

    1. from django.db import models
    2.  
    3. class MBase(models.Model):
    4.     field1 = models.CharField(max_length=10)
    5.     field2 = models.CharField(max_length=10)
    6.     classname = models.CharField(max_length=10)
    7.     def save(self,*args,**kwargs):
    8.         self.classname = self.__class__.__name__.lower()
    9.         super(MBase,self).save(*args,**kwargs)
    10.     @property
    11.     def rel_obj(self):
    12.         return getattr(self, self.classname)
    13.    
    14. class MFirst(MBase):
    15.     myf1 = models.CharField(max_length=10)
    16.    
    17. class MSecond(MBase):
    18.     myf2 = models.CharField(max_length=10)

    А в коде выходит примерно следующее

    1. In [11]: M.MBase.objects.get(id=3)
    2. Out[11]: <MBase: MBase object>
    3.  
    4. In [12]: M.MBase.objects.get(id=3).rel_obj
    5. Out[12]: <MFirst: MFirst object>
    6.  
    7. In [13]: M.MBase.objects.get(id=3).rel_obj.myf1
    8. Out[13]: u'Hi1'

    PS: Чтоб не мучаться, можно вынести функционал в абстрактную модель.

    1. class RelatedBase(models.Model):
    2.     childclassname = models.CharField(max_length=20,editable=False)
    3.     def save(self,*args,**kwargs):
    4.         if not self.childclassname:
    5.             self.childclassname = self.__class__.__name__.lower()
    6.         super(RelatedBase,self).save(*args,**kwargs)
    7.     @property
    8.     def rel_obj(self):
    9.         return getattr(self, self.childclassname)
    10.     class Meta:
    11.         abstract=True

    а все базовые классы уже будут от нее наследоваться

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 07Jun

    django
    Хоть выкраить лишнюю минутку было более чем сложно. Последние две недели у меня Django-NonStop.

    Все основаное на идее, которую я описывал ранее.

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

    В репозитарии лежит пример использования этого приложения вместе с апом. Так что можете просто открыть settings.py и глянуть, какие поля в настройках необходимо добавить. Не стандартные поля помечены ##ADD

    Что под капотом?

    Возможность логить. (В шоке?)

    1. from django.http import HttpResponse
    2. from csvlog import glog
    3. def somelog(request):
    4.     glog('executin log by default name')
    5.     glog.err('ERR, some error hapend')
    6.     glog.imp('IMP, some important information')
    7.     glog.inf('INF, some information')
    8.     glog.log('LOG, some log')
    9.     glog.trc('TRC, some trace')
    10.     glog.dbg('DBG, debug information')
    11.     return HttpResponse('OK')

    И вы можете сами указывать какие данные из стека вы хотели бы сторить. Настройка представляет собой набор ссылок на функции.
    Автоматом сторятся данные реквеста и респонса. Точна также вы можете задавать какие куски этих объектов идут к вам в лог.

    Также под ваш лог, автомат создаётся объект в моделях csvlog.models.LogDump. И вы можете импортировать в него данные из логов и работать с ними через вашу ORM. Пожалуй это основной плюс.

    1. python manage.py log_to_base log.csv

    Ну и маленькая рюшечка в нагрузку. Баг репортинг.

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

    Проект очень, очень нуждается в жесткой критике.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 26May

    obhod_vracheiпоявилась свободная минутка, решил сделать обход джанго блогов.

    И вот некоторые интересные ссылки.

    Виджет на морде. Александр Кошелев рассказывает о создании Яндекс Афиши. Как по мне, то вдохновляет.

    стать я по старее, но примерно про тоже и с той же целью.

    Куда все идут. Иван Сагалаев. Рассказывает о другом яндекс сервисе.

    К слову о предудущей моей статье.

    Global Interpreter Lock: факты и мифы

    И три небольших статьи Александра о наследовании.

    И на последок не джанго JavaScript language advanced Tips & Tricks

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , , ,

  • 19May

    как делать group by в моделях. В доках вещь не очевидная. Работает только с транком.

    1. def count_rubrics(post_filters):
    2.     """get dict rubric id => post count if this rubric
    3.    """
    4.     newobj = M.Post.objects.filter(**post_filters).annotate(count_rubric=Count('rubric')).\
    5.              values('rubric','count_rubric')
    6.     newobj.query.group_by = ['rubric_id']
    7.     ret = {}
    8.     for item in newobj:
    9.         ret[item['rubric']] = item['count_rubric']
    10.     return ret
    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 16Apr

    elite-board Давно хотел переделать сайт своего отца, выдалась свободная минутка и… Это первый мой Django проект, увидевший мир.www.elite-board.net.ua доска объявлений. Ну и пока неделя работы, полет нормальный. Единственное, дизайн, рисовать я не умею, так что особо не стебайтесь, но критику в любом случае выслушать готов.

    Что внутри:

    • I18N — но этим уже никого не напугаешь
    • openid авторизация — почти самописная. Это помимо базовой.

    • Поиск — django-sphinx.
    • Вложеная навигация по тегам.
    • Автодогрузка объявлений при переходе в конец страницы.
    • предпросмотр заотаченых к объявлению картинок

    • Ну и контроль ошибок и CSV логи. Если на сайте происходит сбой, пользователю предлагают самому дополнить информацию о том, как он её получил.

    Хочу услышать вашу критику.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

« Previous Entries   Next Entries »

Recent Posts

Recent Comments

  • похоже, опчатка...
  • JSONotEncode - Это JSON Not Encode? Не сразу это понял )...
  • В чем фишка этого маневра-дублирования?loads = json.l...
  • Очень понравилось!...
  • Если данные простые, я чаще всего пихаю их в ту же таблиц...