пятница, 20 апреля 2012 г.

KIckstart, виджеты vkontakte - и пара седых волос

Сегодня попросили запилить виджет ВКонтакте для отображения ифрейма одной из ВК-групп.
Ранее это я делал сотни раз - ну примитивнейшая задачка, которая сводится лишь к небольшому копипасту. Подключил нужный openapi.js от ВКонтакте.
Поместил нужный код (div+script) в нужное место нужного сайдбара и обновил страницу. Увидел два идентичных блока с данными группы. "Ха, ерунда" , подумал я , будучи уверен, что скопировал лишний div или что-то вроде того...
 Увидился, когда код оказался в порядке. И началось... Ну сплошная мистика - откуда второй блок - неясно.
 Забегая вперед - на пальцах и сейчас не объясню , откуда...  Но в итоге нашел "виновника"...
На данном сайте используется CSS - фреймворк Kickstart. Довольно практичная и удобная штука, надо сказать. Ну так вот. Этот фреймфорк идет вместе со своим js-тулкитом, в котором заплен функционал для простеньких слайдшоу, некоторая хитрая работа с DOM и т.д. Файл подключен в <head>. В консоль ошибками не плюется. Сам фреймворк отлажен и пользуется популярностью у существенного количества людей. Но вот ВКонтактовский виджет зачем-то клонирует) В итоге пришлось <script> , рисующий вконтактовский ифрейм помещать непосредственно перед </body> , чтобы не дать никому шанса все испортить...
Виджетов теперь ровно столько, сколько надо - один :)

p.s. какой именно код kickstart.js все испохабил я пока не понял.. будет время (а это врядли ) - раскопаю :)

среда, 18 апреля 2012 г.

django: совместимость с 1.4 : settings.py - ImproperlyConfigured: Error importing template source loader

В продолжении предыдущего поста о совместимости с django 1.4

Может возникнуть следующая проблема с загрузкой шаблонов при рендеринге:

ImproperlyConfigured: Error importing template source loader django.template.loaders.app_directories.load_template_source: "'module' object has no attribute 'load_template_source'"


Решение: закомментировать TEMPLATE_LOADERS в settings.py и скопипастить аналогичные настройки из settings.py , сгенерированного django-admin от версии 1.4

django: совместимость с 1.4 : diario - ImportError: No module named feeds

Не так давно вышел официальный релиз django 1.4
До его выхода кто-то дальновидно заранее начинал работать с пре-релиз версией и портировать на нее свои существующие проекты.

Те, кто предпочел использовать в повседневновсти стабильную версию 1.3 теперь либо продолжают ее использовать, либо потихоньку (ведь никто не гонит) , переводят проекты на 1.4.

При этом у каждого НЕИЗБЕЖНО возникнут большие и малые трудности..

Дело в том, что весь зоопарк сторонних django-приложений еще не успел актуализироваться вслед за измененями в django, которые появились в версии 1.4

В этом и быть может последующих постах буду более менее существенные моменты отражать - быть может этот опыт пригодиться кому-то быстрее решить проблему миграции..

1. django-diario - неплохое приложение для организаци блога. В нем я наткнулся на ошибку импорта в 13-й строке файла diario/feeds/entries.py:

  from django.contrib.syndication.feeds import Feed
ImportError: No module named feeds

Действительно, в версии 1.4 нет файла feeds - вместо него используется views - видимо так правильнее ) Имена сущностей те же.. то есть, теперь надо

from django.contrib.syndication.views import Feed


Проверил - в текущей версии diario проблема не решена , поэтому пришлось пока "ручками" поправить.

2. еще одно замечание про diario
Из-за того же рефакторинга django.contrib.syndication изменился и способ работы с фидами, которые предоставляет diario.
Если раньше вы подключали url-ы для фидов примерно так:

from diario.feeds.entries import RssEntriesFeed, AtomEntriesFeed
entries_feeds = {
        'rss': RssEntriesFeed,
        'atom': AtomEntriesFeed,
    }
#...
urlpatterns = patterns(
    url(r'^pub/(?P(rss|atom))/$', 'django.contrib.syndication.views.feed', {'feed_dict': 
entries_feeds}),
)


то теперь это надо делать так:

from diario.feeds.entries import RssEntriesFeed, AtomEntriesFeed
#...
urlpatterns = patterns(
    url(r'^pub/(?Prss)/$', RssEntriesFeed()),
    url(r'^pub/(?Patom)/$', AtomEntriesFeed()),
)



Удачи!