• 01Jul

    при создании нового джанго проекта я всегда выделяю две папки apps – для моих апов и compat – для сторонних апов, к разработки которых я не имею никакого отношения. Идея в том, что эти апы всегда остаются неприкосновенными для меня, и единственной точкой расширения остаются сеттингсы и возможно доп параметры, при инклюде урлов.

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

    • catalog
      • urls.py
      • views.py
      • models.py
      • settings.py
      • tests.py

    для 4 первых файлов можно просто вконце файла добавить строку, которая станет универсальной точкой расширения. Например для views.py

    1. try:
    2.     from ex_catalog.views import *
    3. except ImportError:
    4.     pass

    таким образом, если кто-то будет использовать Вашу апу — точкой расширения будет дополнительная апа ex_catalog, в котором вы можете переопределить некоторый функции из view.py, и при этом ex_catalog не надо добавлять в список апов в настройках.

    А теперь главный вопрос этого поста. Почему так не делают?

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • 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
    • 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
    • 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: , , ,

  • 07Apr

    Если вы хотите пользоваться всеми переменными окружения Django, но при это “находится” не врутри какой либо вьюхи, т.е. код запускается не через Http запрос, а к примеру – через крон, то начинаться этот скрипт у вас должен такими словами, и лежать он должен в коре вашего проекта:

    1. #!/usr/bin/python
    2. # coding: utf-8
    3. from django.core.management import setup_environ
    4. import settings
    5. setup_environ(settings)

    Успехов…

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • 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: , , , ,

  • 01Dec

    Сегодня из интереса написал небольшой модуль сериализации в ХМЛ. На скорую руку. Как по мне – довольно элегантное решение. Как думаете?

    1. def xml_escape(text):
    2.     return str(text).replace('&','&amp;').replace('<','&lt;').replace('>','&gt;').replace('"','&quot;').replace("'",'&apos;')
    3.  
    4. def xmlSerial(name,attr=None,inner=None):
    5.     if attr:
    6.         name_attr = name+' '+' '.join(map(lambda (a,b):a+'="'+xml_escape(b)+'"',attr.items()))+' '
    7.     else:
    8.         name_attr = name
    9.    
    10.     if inner:
    11.         if type(inner) == list:
    12.             inner_str = ''.join(map(lambda a: xmlSerial(*a),inner))
    13.         else:
    14.             inner_str = inner
    15.         return '<'+name_attr+'>'+inner_str+'</'+name+'>'
    16.     else:
    17.         return '<'+name_attr+'/>'

    Вот, как его мона юзать:

    1. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW',{'and_attr':'45t'}],['WIN',{'a':1},'HI IT IS INNER']])
    2. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW',{'and_attr':'45t'}]])
    3. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW']])
    4. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},'AND INNER')
    5. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'})
    6. print xmlSerial('HI',{'a':'1'})
    7. print xmlSerial('HI')
    Share and Enjoy:
    • Facebook
    • LinkedIn
    • 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: , , , ,

  • 19Jul

    что мне надо от логов:
    1) конешно выводить точку запуска + время в каждом запускаемом логе + дополнительная инфа, как правило у разных проектов она разная.
    2) выводить не только сроку, но и более сложную структуру.
    3) разные функции для логов ( info, error, debug,trace) чтоб на внешнем серваке отказываться от определенных из них, причем делать этот без потери скорости.

    sub _log{
    my ($self,$type,$text,$cl) = @_;
    my @tt = localtime;
    my ($pack,$filename,$line) = caller(1);
    my ($topack,$tofile,$toline) = caller($cl) if($cl);
    $line = "($type)".POSIX::strftime("%d,%h %H:%M:%S",localtime)." $filename($line) ";
    if($cl){
    my ($topack,$tofile,$toline) = caller($cl) ;
    $line.= "{$tofile($toline)}";
    }
    # тут линию можно дополнить своими
    open my $fh,'>>'.MyProject::Conf::LOGFILE;
    print $fh $line.$text."\n";
    close $fh;
    }
    
    my $alog = MyProject::Conf::LOGS;
    my $clog = MyProject::Conf::CLOGS;
    
    no strict 'refs';
    
    foreach my $ll (@$alog){
    my $method = lc $ll;
    if(grep {$_ eq $ll} @$clog){
    *{$method} = sub{my $self = shift; $self->_log($ll,@_)};
    *{$method.'_dump'} = sub{my $self = shift; my $text = shift; my $data = shift; $self->_log($ll,$text.':'.Dumper($data),@_)}
    }else{
    *{$method} = sub{};
    *{$method.'_dump'} = sub{};
    }
    }
    

    немного по коду… MyProject::Conf::LOGFILE – тут просто лежит абсолютный путь к файлу логов.
    MyProject::Conf::LOGS – тут лежит массив имен всех доступных логов, я использую ['INFO','DEBUG','DERROR','TRACE']
    MyProject::Conf::CLOGS – массив логов которые необходимо выводить. Так я сделал потому, что не в се используемые логи необходимо выводить в данном запуске проекта.

    цикл идущий после no strict ‘refs’;

    просто заполняет функции. имен всех функций переводятся в нижний регистр. + добавляется еще и функция dump, для info она будет info_dump, которая кроме передой строки, в лог еще запишет передаваемую структуру, выводимую с помощью Data::Dumper

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • 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: , ,

   

Recent Posts

Recent Comments

  • Я просто оставлю это тут: ...
  • спасибо...
  • Если вдуматься в каждое слово, то время беСконечно в русском...
  • Спасибо, Евгений, исправленно.P.S.: перехал на диску...
  • за опечатку - спасибо...