Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 09Nov

    winpdbХоть простой и нативный pdb и так нам давал все что надо, все же приятно понимать, что есть еще чтото, что может сделать наш девелов приятней. WinPDB – одна из этих приятностей (наткнулся на нее вДжанговкой Вики) . Если коротко – это дебагер с приятным пользовательским интерфейсом, которой кросc-платформенный к слову говоря.

    Пользовать легко.
    Раньше вы коде оставляли:

    1. import pdb; pdb.set_trace()

    А теперь получается чуть длиннее:

    1. import rpdb2; rpdb2.start_embedded_debugger('mysuperpassword')

    На сколько я понял, этот пароль нужен для авторизации дебагера в эту точку прерывания. Т.е. как и pdb, rpdb2 отсанавливает выполение в этой строке.

    Запускаем winpdb. File => Attach. В появившемся окне вводим наш пароль mysuperpassword. В полученном списке выбираем наш.

    Но самое клевое, что теперь мы можем дебагером зацепиться там, где раньше не умели, например wsgi скрипт висит в апаче. Мы можем по средствам этого механизма присосаться и к нему.
    Screenshot-views.py

    P.S. …

    И Django Cheet Sheet, кто еще не знает…
    И надо будет испытать django-tinymce

    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
    [?]
  • 01Oct

    Я уже посягал на суверинитет джанги. Но это было давно и не правда. Более того, меня тогда убедили, что делаю я глупости, и я даже убедился сам, в последствии, что на самом деле делаю глупости. Но мысть о том, что urls.py не нужен – не перестает меня беспакоить. Поэтому очередно фин, аморальный бред – называйте как хотите, но мне безумно нравится.

    Идея проста. Вьюха и урла всегда вместе – а значит одно должно быть декоратаром для другого.

    Итак главный urls.py имеет обычный вид

    1. from django.conf.urls.defaults import *
    2.  
    3. urlpatterns = patterns('',
    4.     (r'^someurl/',include('someapp.url_view')),
    5. )

    /someapp/url_view.py – тут у нас сбстно и хранятся вьюхи с урлами. Как видите, декоратор tourl нам земенил запись в urls.py

    1. from django.http import HttpResponse
    2. from tourl import tourl
    3.  
    4. @tourl(r'^and/$')
    5. def and_(request):
    6.     return HttpResponse('and')
    7.  
    8. @tourl(r'^gg/$')
    9. def index(request):
    10.     return HttpResponse('OK')

    /someapp/tourl.py – ну и код самого декоратора

    1. from django.conf.urls.defaults import *
    2. import sys
    3. import functools
    4. def tourl(url_patern,*args,**kwargs):
    5.     def paramed_decorator(func):
    6.         @functools.wraps(func)
    7.         def decorated(self):
    8.             return func(self)
    9.         module =sys.modules[func.__module__]
    10.        
    11.         if not hasattr(module, 'urlpatterns'):
    12.             module.urlpatterns = patterns('',)
    13.              
    14.         module.urlpatterns   += patterns('',
    15.             url(url_patern,decorated,*args,**kwargs),
    16.         )
    17.         return decorated
    18.     return paramed_decorator

    Помоему и симпотично и по производительности не бьет. Вобщем конфетка! Что скажите?

    PS: Добавил снипет.

    PSS: В снипетсах посоветовали добавить functools.wraps

    PSS: А еще можно использовать и так

    1. from django.http import HttpResponse
    2. from tourl import tourl, patterns,url
    3.  
    4.  
    5.  
    6. @tourl(r'^and/$')
    7. def and_(request):
    8.     return HttpResponse('and')
    9.  
    10.  
    11. def index(request):
    12.     return HttpResponse('OK')
    13.  
    14. tourl(r'^gg/$')(index)
    15.  
    16.  
    17. def ordinary(request):
    18.     return HttpResponse('Ordinary')
    19.  
    20. urlpatterns += patterns('',
    21.             url(r'^ord/$',ordinary)
    22.         )
    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: , , , , ,

  • 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: , , ,

  • 07Aug

    Хоть и старенькое, но полезненькое.
    Основатель Pinax James Tauber. Рассказывает о своем детище. Pinax – это сборная солянка джанго апов для ускорения разработки. Апы в основном с уклоном на социальность. Вобщем упомянутые апы в любом случае стоят вашего внимания.

    PyCon 2009

    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

    Lazy Crazy Coder’s blog from Alexander Artemenko.

    Для себя отметил пару ссылок оттуда.

    Python testing tools

    Big list of Django tips (and some python tips too) – статья не новая, но есть еще очень актуальные вещи.

    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: , , , , , , ,

  • 31Jul

    398725Задача. У вас есть две таблици, связаны друг с другом как OneToOne. Но в админке их не удобно править раздельно. Хочется это делать в одном месте. К примеру возьмем профайл и юзер. Хотя мне кажется, что профайлы в джанго — это как кость в горле. Из-за них объединение присоединение больших приложений типа формов или блогов превращается в целый геморой. Но свои соображения и идеи по этому поводу я освещу в отдельно статье.

    1. Вывод записей. Решается просто вы добавляете в админ-моделе ( не знаю, как правильно назвать этот элемент джанги, ваш наследник от admin.ModelAdmin ) функцию

    1. def user_name(self,obj):
    2.         user = obj.user
    3.         return u'%s %s' %(user.first_name,user.last_name)
    4. user_name.short_description = u'Имя'

    и в list_display строку с именем этой функции

    2. Поиск. Тут все просто. В search_fields добавляем user__username
    3. Фильтры. Возможно вы мне подскажите, но у меня не получилось добавить поле из связной таблици в качестве фильтра. Поэтому я просто использую в админке как «основную» – ту таблицу, в которой поля будут использоваться в качестве фильтров. Надо будет залезть в исходники с грязными ногами и выяснить, что за лажа.

    4. Редактирование. Создаем отдельно форму и добавляем в ней новые поля, и переопределяем инициализацию и сохранение.

    1. class ProfileForm(forms.ModelForm):
    2.     first_name = forms.CharField(max_length=30,label=u'Имя')
    3.     last_name = forms.CharField(max_length=30,label=u'Фамилия')
    4.    
    5.     def __init__(self,*args,**kwargs):
    6.         super(ProfileForm,self).__init__(*args,**kwargs)
    7.         user = pr.user
    8.         self.initial.update({
    9.                 'first_name':user.first_name,
    10.                 'last_name':user.last_name
    11.             })
    12.        
    13.     def save(self,*args,**kwargs):
    14.         user = self.instance.user
    15.         user.first_name = self.cleaned_data['first_name']
    16.         user.last_name = self.cleaned_data['last_name']
    17.         user.save()
    18.         return super(ProfileForm,self).save(*args,**kwargs)
    19.        
    20.     class Meta:
    21.         model = M.StatusChatProfile

    Форму передаем нашей админ-моделе.
    С формой есть маленькая проблемка, на которую я наступил. В момент, когда вызывается super(…).save(…) фактическое сохрание данных еще не происходит. И это необходимо учитывать, в случае, если его “таблица напарник” при сохранении изменяет в нем же какие либо поля. Данные в этом случае перетрутся.

    Спасибо за внимание. Вам успехов и удачного дня.

    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
    [?]
  • 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: , , ,

« Previous Entries   Next Entries »

Recent Posts

Recent Comments

  • Благодарю, начал изучать fabric с вашей статьи....
  • Идея действительно отличная и очень радует то, что подобн...
  • Спасибо...
  • Там четыре круглых кнопочки. Подразумевается, что каждая ...
  • А в чем заключатеся неправильна работа?...