Поразительно мрачный глюк сегодня уделал меня в flatpages!
Приложение в debug =True работает на ура. При debug = False то работает то нет! Пока понял закономерность - поседел.
Валились страницы , где рендерились flatpages. Понял , что в них дело , но как пофиксить никак не мог дотукать. Почитал матчасть и освежил особенность , связанную с обработкой 404. Простая страница будет рендериться, если не найдено ни одного подходящего урла. Да, только оказалось, что еше ей нужен фейковы 404.html в корне темплейтов. Ужас. Поди - догадайся!
Надеюсь кому-то помогло.
p.s. да... еще проверьте, что у вас не переопределены хендлеры для 404, а то тоже не получится отрендерить простую страницу...
четверг, 24 мая 2012 г.
среда, 16 мая 2012 г.
django: flatpages error "Cannot use None as a query value"
Если при попытке сохранения flatpage из админки django вылезает страница с ошибкой "Cannot use None as a query value", то скорее всего вы не заполнили то или иное обязательное поле. И скорее всего - это поле site. Оно так неявно расположено и еще более неявно является обязательным, что все наступают на эти грабли.
А почему не срабатывает стандартный для админки контроль обяхательных полей - без страшных страниц со стеками? А потому что баг и в транке он уже пофикшен Ticket #18324
Просто не ожидаешь такого от контрибовских приложений для стабильной версии.
Ну ничего, бывает )
А почему не срабатывает стандартный для админки контроль обяхательных полей - без страшных страниц со стеками? А потому что баг и в транке он уже пофикшен Ticket #18324
Просто не ожидаешь такого от контрибовских приложений для стабильной версии.
Ну ничего, бывает )
суббота, 12 мая 2012 г.
batch file encoding convertaion
If you need to change encoding of large amount of files in *nix you could find + iconv
For example, you are in some site directory and wanna convert all html-files from cp1251 to utf8:
~$ find ./ -name "*.html" -exec iconv -f cp1251 -t utf8 {} -o {}.utf8 \;
~$ find ./ -name "*.html" -exec mv {}.utf8 -o {} \;
find ./ -name "*.html" -exec mv {}.utf8 {} \;
Good luck.
PHP: is_a(): Deprecated. Please use the instanceof operator
Попался тут один сайтик написанный на древней версии php , который пылился в архиве лет 5 и теперь должен быть восстановлен.
Имеется в распоряжении хостинг с поддержкой php5.
Сайт запустился с пол-пинка, но я постоянно ждал , что какие-нибудь проблемы с совместимостью все-таки вылезут.
Так и получилось. В одном из сценариев выполение завершилось ошибкой:
is_a(): Deprecated. Please use the instanceof operator
Полез в код и заменил проблемную строку :
#if(!is_a($_m5_controls, "Tpl"))
if(!$_m5_controls instanceof Tpl)
Вот такая вот небольшая шпаргалка )
пятница, 20 апреля 2012 г.
KIckstart, виджеты vkontakte - и пара седых волос
Сегодня попросили запилить виджет ВКонтакте для отображения ифрейма одной из ВК-групп.
Ранее это я делал сотни раз - ну примитивнейшая задачка, которая сводится лишь к небольшому копипасту. Подключил нужный openapi.js от ВКонтакте.
Поместил нужный код (div+script) в нужное место нужного сайдбара и обновил страницу. Увидел два идентичных блока с данными группы. "Ха, ерунда" , подумал я , будучи уверен, что скопировал лишний div или что-то вроде того...
Увидился, когда код оказался в порядке. И началось... Ну сплошная мистика - откуда второй блок - неясно.
Забегая вперед - на пальцах и сейчас не объясню , откуда... Но в итоге нашел "виновника"...
На данном сайте используется CSS - фреймворк Kickstart. Довольно практичная и удобная штука, надо сказать. Ну так вот. Этот фреймфорк идет вместе со своим js-тулкитом, в котором заплен функционал для простеньких слайдшоу, некоторая хитрая работа с DOM и т.д. Файл подключен в <head>. В консоль ошибками не плюется. Сам фреймворк отлажен и пользуется популярностью у существенного количества людей. Но вот ВКонтактовский виджет зачем-то клонирует) В итоге пришлось <script> , рисующий вконтактовский ифрейм помещать непосредственно перед </body> , чтобы не дать никому шанса все испортить...
Виджетов теперь ровно столько, сколько надо - один :)
p.s. какой именно код kickstart.js все испохабил я пока не понял.. будет время (а это врядли ) - раскопаю :)
Ранее это я делал сотни раз - ну примитивнейшая задачка, которая сводится лишь к небольшому копипасту. Подключил нужный 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
Может возникнуть следующая проблема с загрузкой шаблонов при рендеринге:
Решение: закомментировать TEMPLATE_LOADERS в settings.py и скопипастить аналогичные настройки из settings.py , сгенерированного django-admin от версии 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:
Проверил - в текущей версии diario проблема не решена , поэтому пришлось пока "ручками" поправить.
2. еще одно замечание про diario
Из-за того же рефакторинга django.contrib.syndication изменился и способ работы с фидами, которые предоставляет diario.
Если раньше вы подключали url-ы для фидов примерно так:
то теперь это надо делать так:
Удачи!
До его выхода кто-то дальновидно заранее начинал работать с пре-релиз версией и портировать на нее свои существующие проекты.
Те, кто предпочел использовать в повседневновсти стабильную версию 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()),
)
Удачи!
среда, 28 марта 2012 г.
BOOTSTRAP CSS FRAMEWORK: проблема с carousel ( Cannot read property 'end' of undefined)
Использую в одном из проектов css-фреймворк bootstrap от twitter.
Вчера обнаружил очередное обновление, вместе с которым появился js-плагин для слайдшоу.
Подключил его отдельным скриптом bootstrap-crousel.js и при прокрутке первого же тестового элемента слайдшоу получил ошибку в js-консоли:
Немного попыхтев обнаружил, что этот плагин не совсем самостоятелен и зависит от других плагинов этого фреймворка.
В частности от bootsrap-transitions.js.
Пришлось подключить и его.
А вообще , проще всего подключить весь bootstrap.js во избежание подобных багов в будущем.
Вчера обнаружил очередное обновление, вместе с которым появился js-плагин для слайдшоу.
Подключил его отдельным скриптом bootstrap-crousel.js и при прокрутке первого же тестового элемента слайдшоу получил ошибку в js-консоли:
Cannot read property 'end' of undefinedсо ссылкой на 109 строку bootstrap-carousel.js
Немного попыхтев обнаружил, что этот плагин не совсем самостоятелен и зависит от других плагинов этого фреймворка.
В частности от bootsrap-transitions.js.
Пришлось подключить и его.
А вообще , проще всего подключить весь bootstrap.js во избежание подобных багов в будущем.
четверг, 22 марта 2012 г.
nginx: unknown directive "uwsgi_pass"
Постепенно начинаю отказываться от apache как основного веб-сервера для своих проектов.
Альтернатива? Буду банален - nginx.
Решил описывать все камушки, каменюги , грабли и грабельки , на которые буду наступать в ходе освоения этого броузера.
Итак, первая "проблема":
На Debian 6 установил nginx из репозитория .
Настроил на взаимодействие с django проектом через uwsgi.
Первый запуск веб-сервера завершился ошибкой: nginx: unknown directive "uwsgi_pass"
проблема оказалась в том, что дефолтный веб-сервер в репозитории squeeze-а не содержит по дефолту модуль для работы с uwsgi.
Это изменено начиная с nginx версии 0.8. В репозитории 0.7.67 - так что все объяснимо.
Качаю исходники последнего стабильного релиза nginx:
Да, дефолтную версию nginx лучше удалить.
Альтернатива? Буду банален - nginx.
Решил описывать все камушки, каменюги , грабли и грабельки , на которые буду наступать в ходе освоения этого броузера.
Итак, первая "проблема":
На Debian 6 установил nginx из репозитория .
Настроил на взаимодействие с django проектом через uwsgi.
Первый запуск веб-сервера завершился ошибкой: nginx: unknown directive "uwsgi_pass"
проблема оказалась в том, что дефолтный веб-сервер в репозитории squeeze-а не содержит по дефолту модуль для работы с uwsgi.
Это изменено начиная с nginx версии 0.8. В репозитории 0.7.67 - так что все объяснимо.
Качаю исходники последнего стабильного релиза nginx:
cd /usr/src/nginx
wget http://nginx.org/download/nginx-1.1.9.tar.gz
tar xfz nginx-1.1.9.tar.gz
cd nginx-1.1.9
#подсмотрел рекомендуемые опции конфигурирования в инете :)
./configure --pid-path=/var/run/nginx.pid \
--conf-path=/etc/nginx/nginx.conf \
--sbin-path=/usr/local/sbin \
--user=www-data \
--group=www-data \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--with-http_stub_status_module \
--with-ipv6 \
--with-http_ssl_module \
--with-http_realip_module \
--with-sha1-asm \
--with-sha1=/usr/lib \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--with-http_geoip_module \
--with-http_gzip_static_module \
--with-http_sub_module \
--with-http_addition_module \
--with-file-aio \
--without-mail_smtp_module
#модулей много заюзали, так что у вас configure может ругнуться на отсутствие необходимых
#для сборки библиотек..
#ставим все, что нужно
apt-get install libpcre3 libpcre3-dev openssl libssl-dev libgeoip-dev libgeoip1
#после этого конфигурируется без ошибок
make
make install
mkdir /var/tmp/nginx #ибо при конфигурировании мы попросили nginx писать времянки именно сюда)
chown www-data /var/tmp/nginx #вместо www-data подставьте нужного пользователя
Да, дефолтную версию nginx лучше удалить.
вторник, 20 марта 2012 г.
django: range - цикл в шаблоне
Встроенный в django шаблонный движок , как оказалось, не поддерживает циклы по диапазону значений.
Например , в шаблон передается некоторое число и необходимо организовать цикл от 0 до этого числа - 1
Средствами встроенных шаблонных тегов и фильтров сделать это , судя по всему , нельзя. Но есть простое решение : передавть в шаблон не число а значение, возвращаемое встроенной python-функцией range.
Например там, где было
надо сделать
после чего в шаблоне можно уже делать вот так:
Например , в шаблон передается некоторое число и необходимо организовать цикл от 0 до этого числа - 1
Средствами встроенных шаблонных тегов и фильтров сделать это , судя по всему , нельзя. Но есть простое решение : передавть в шаблон не число а значение, возвращаемое встроенной python-функцией range.
Например там, где было
... context['num'] = Somemodel.objects.count(), ...
надо сделать
... context['num'] = range(Somemodel.objects.count()), ...
после чего в шаблоне можно уже делать вот так:
...
{%for i in num%}
...
{%endfor%}
...
Подписаться на:
Сообщения (Atom)