Below is the text of the page https://livedev.org/articles/page/4 stored 2008-06-09 by archive.org.ua. The original page over time could change. View as original html

Older posts, page 4 : Веб-разработка «по-русски» | livedev.org

livedev.org [http://livedev.org] Веб-разработка «по-русски» Проверка HTTP-запроса на аяксовость (ajax) 4 Posted by dobrych Wed, 25 Apr 2007 09:43:00 GMT При написании приложения по принципам MVC с использованием Ajax, часто для одного и того же запроса нужно получить данные в двух отличных друг от друга вариантах—в чистом HTML и в XML /json для Ajax запроса. А т.к. один и тот же контроллер в MVC обрабатывает оба типа запроса и скорее всего было бы удобно для его обработки использовать один и тот же URL , надо как-то отличать их, чтоб знать в каком формате отдать данные. Если это POST -запрос то можно просто создать дополнительное поле/переменную в запросе, а если GET , то нужно или отдельный URL для каждого типа данных или дополнительный заголовок в запросе (см. ниже почему). Проблема мне кажется больше именно в GET запросе. Если следовать правилам ReST , то контент полученный по URL должен быть кеширован, а в нашем случае будет кеширован первый формат, в котором контроллер отдаст контент. Было бы удобно чтоб контроллер делал проверку на наличие каких-то заголовков и отдавал в зависимости от них ответ в нужном виде, но вот кеширование этому помешает. Т.к. кеш скеширует контент на первый попавшийся запрос (Ajax/HTML) и для следующего отличного запроса может быть отдан контент в неверном формате. Конечно можно с помощью заголовков вообще отключить кеширование, но это неоправдано, т.к. в протоколе HTTP не зря предусмтрена такая функциональность. В общем решением была бы возможность реагирования кеша на определенные заголовки от сервера. И да, это указано в стандарте HTTP и реализовано как клиентами так и серверами. Есть такой заголовок в стандарте HTTP — Vary: , обычно его называют Vary Header . Он необходим как раз для осуществления правильного кеширование в зависимости от его значения. По большому счету он нужен чтоб указать кешу для какого заголовка запроса скеширован данный URL . Т.е. контент в кеше теперь будет идентифицироваться не только по URL , но по URL + заголовок указанный директивой Vary. Например, если пользователь залогинен на сайт с использованием Cookie, тогда заголовок Vary должен выглядеть так Vary: Cookie . URL в это случае, например, будет /profile/ (профиль пользователя) и два разных пользователя, попав на страницу из одного кеша будут проверены с помощью директивы Vary на предмет Cookie и получат разный контент. Или например кеширование должно производиться с учетом языка пользователя, тогда директива будет выглядить так Vary: Content-Language . Зачем это нужно в нашем случае? Все просто—практически все Javascript Toolkits используют заголовок HTTP _X_REQUESTED_WITH со значением ‘XMLHttpRequest’. Так что если мы поставим Vary: HTTP _X_REQUESTED_WITH , то оба запроса к одному URL но от разных инициаторов (сам браузер или javascript/ajax код) будут скешированы отдельно. Вот такой интересный нюанс. Может кому-то пригодится в деле. Posted in статьи Tags ajax , cache , header , http , mvc , vary Meta no trackbacks , 4 comments , permalink , rss , atom Подкасты про webdev 1 Posted by dobrych Wed, 18 Apr 2007 14:06:00 GMT Последнее время стал увлекаться подкастами . К сожалению русскоязычных качественных очень мало. А на тему веб-разработок вообще нет (поправьте если ошибаюсь). Хочу привести свою подборку англоязычных подкастов, которые слушаю. Начну с наиболее интересного для меня— Hivelogic Radio . В этом подкасте автор концентрируется на веб-разработке, как на дизайне так и на программировании. Очень интересные интервью с интересными людьми. В разработке есть акцент на Ruby on Rails. Со стороны аудио, подкаст сделан очень качественно. Приятно слушать. Следующий подкаст я слушаю не так давно, но у него довольно большой авторитет— FOO Casts: Podcasts from O’Reilly & Friends В нем освящается много технических вопросов, необязательно связанных с вебом, но все равно полезных для любого гика и разработчика. Качества звука тоже на высоте. Inside Silicon Valley —Подкаст, состоящий в основном из интервью с монстрами и просто успешными людьми из Силиконовой Долины. Качество хорошее, слушать интересно. Python411 Podcast —для фанов Python. Качество звука не впечатляет, но темы и интервью довольно интересные. Так что подкаст пожалуй действительно для фанатов Python. Освящаются вопросы не только веб-разработки, но и других специализаций в программировании. WebDevRadio —Действительно настоящий подкаст именно для веб-разработчика. Обсуждение новых технологий в вебе, интервью, относительно часты обновления. Советую. The Mac Attack —Подкаст про Mac, MacOSX и все что с ним связано. Как известно многие современные веб-разработчики и дизайнеры выбирают платформу Apple в качестве рабочей станции. Так что думаю будет просто интересно, а некоторым и полезно. Posted in обзоры Tags podcast , python , rails , ruby , webdev Meta no trackbacks , 1 comment , permalink , rss , atom Typo 4.1 — обновляемся Posted by dobrych Sun, 15 Apr 2007 14:09:00 GMT Обновление моего блога. На днях обновил свой блог на движке typo , до весрии 4.1 Впечатления пока что только приятные. Сразу бросается в глаза подчищенная админка. Большой плюс еще, что блог движок работает на rails 1.2 и заметный прогресс в том, что есть встроенная возможность локализации. Процесс переезда прошел прозрачно, почти без бубна и плясок :-) Итак пошагово, для тех, кто будет повторять: Бекапим базу в двух вариантах— SQL -дамп и сериализованный YAML вариант. Первое делается через mysqldump или phpmyadmin, а второй вариант командой rails-backup в директории с rails-проектом блога. Обновляем rails и typo . Т.к. у меня все работает через rubygem , я просто запустил sudo gem update . После чего получил последние стабильные gems. Останавливаем текущий процесс typo . Переименовываем директорию проекта и создаем заново проект с typo— typo install my_typo_dir Переносим конфиги из старой в новую директорию (обычно это database.yml и mongrel_cluster.yml ). И обновляем базу rake db:migrate . После чего запускаем проект (у меня он работает через mongrel cluster), логинимся в админку и первым делом нам предлагается поменять контент в базе на новый лад. Нужно просто согласиться и блог готов к работе. Если появились трудности при апдейте—пишите, чем смогу помогу. PS: В рассылке видел, что у одного человека возникли проблемы при переезде с базой. У него полечилось через rails-backup и rails-restore Posted in заметки , обзоры Tags backup , mongrel , mysql , rails , restore , ruby , typo , update Meta no trackbacks , no comments , permalink , rss , atom django: как создать html сообщение Posted by dobrych Wed, 21 Feb 2007 12:43:00 GMT Вот по следам недавних дискуссий в django-users пишу заметку как создавать имейлы с аттачами и html-ом. Есть патчи в тикете #1541 для интеграции в саму джангу или можно воспользоваться примерами кода отсюда и отсюда . Posted in заметки Tags attach , django , email , html Meta no trackbacks , no comments , permalink , rss , atom django.vim Posted by dobrych Tue, 30 Jan 2007 17:24:00 GMT Обновился vim-овский файл синтаксиса для django. смотреть на vim.org Добавили: новую систему комментариев {# greeting #} улучшили подсветку ошибок, например {{ variable %} будет подсвечено как ошибка Posted in заметки Tags django , syntax , vim Meta no trackbacks , no comments , permalink , rss , atom django: работа с несколькими версиями 1 Posted by dobrych Thu, 25 Jan 2007 15:32:00 GMT В связи с появлением в trunk-ветке django такой прикольной библиотеки, как newforms , пришлось на нескольких проектах переползать на trunk. При этом все остальные должны стандартно работать на версии 0.95 В системе стоит как раз 0.95 (в site-packages). Проекты работают все на связке mod_python + apache. При настройке mod_python для django-проекта используется директива PythonPath . С её помощью к путям поиска python-модулей добавляется директория с проектом. Поэтому достаточно положить дистрибутив django в ту же директорию где лежит проект. А вот для отладки приложения приходится немного пошаманить. Я так и не разобрался в чем причина, но когда запускаешь python shell ( python manage.py shell ) в любом случае в списке директорий с модулями site-packages оказываются первее чем то, что добавляешь в PythonPath переменную окружения. В итоге получается что используется версия django, котрая стоит в site-packages (т.е. 0.95). Решается всё довольно просто, но дошел я до этого не сразу, т.к. боролся чтоб всё было кошерно :-) (через python manage.py shell ). Сначала грешил на ipython, но без него была та же петрушка. Наковырявшись вдоволь я сделал потом всё по быстрому и просто. Надо установить две системные переменные в shell-окружении: PYTHONPATH =’ path_to_Django_project ‘ DJANGO _SETTINGS_MODULE= my_project.settings После этого в любой директории набераете python или ipython и делаете импорты из моделей и работаете с ними. Posted in заметки Tags debug , django , env , path , python , shell Meta no trackbacks , 1 comment , permalink , rss , atom openid enabled Posted by dobrych Wed, 10 Jan 2007 15:04:00 GMT У меня сабж :-) Нашел наконец-то время разобраться с openid , как и предполагал ничего особо сложного нет. Все делал по этим статьям: OpenID for non-SuperUsers OpenID delegation under Django and lighttpd Теперь бы еще запустить свой openid сервер :-) Для моего Typo блога всё свелось к нескольким манипуляциям. регистрация на myopenid создание yadis.xrdf файла конфигурация apache добавлении строчки кода в хидер темплейта блога Вот мой yadis.xrdf http://openid.net/signon/1.0 http://www.myopenid.com/server http://dobrych.myopenid.com/ Вот строки для конфигурации апача: # OpenID AddType application/xrds+xml .xrdf RewriteCond %{HTTP_ACCEPT} application/xrds\+xml RewriteCond %{HTTP_ACCEPT} !application/xrds\+xml\s*;\s*q\s*=\s*0(\.0{1,3})?\s*(,|$) RewriteRule ^$ http://livedev.org/yadis.xrdf [R,L] Header onsuccess set X-XRDS-Location http://livedev.org/yadis.xrdf Вот строка, добавленная в шаблон Posted in заметки Tags apache , blog , enabled , openid , typo , xrdf , yadis Meta no trackbacks , no comments , permalink , rss , atom Мультисайтовость в django trunk 2 Posted by dobrych Wed, 27 Dec 2006 09:01:00 GMT Наконец-то появиалсь функциональность мультисайтинга в Django Framework . Напомню что раньше надо было для каждого сайта держать отдельную instance фреймвока (в смысле или отдельный fastcgi процесс или отдельно сконфигурированный виртуальный хост с mod_python). В конфигурации проекта (settings.py) надо указывать SITE _ID, который в базе соответствует какому-то домену. И для каждого домена нужно было держать отдельный settings.py с соответствующим SITE _ID из базы. Теперь в транк попал патч и новый middleware, который позволит в рамках одного проекта обслуживать несколько доменов. Домены будут определяться ”на лету”. Теперь можно писать вот такие конструкции: HOST_MIDDLEWARE_URLCONF_MAP = { "company.com": "mydjango.app.company_urls", "blog.example.com": "mydjango.app.blog_urls", } Подробнее на сайте автора и тикет . Posted in заметки Tags django , midleware , multisite , trunk Meta no trackbacks , 2 comments , permalink , rss , atom Борьба с утечкой памяти в ruby (mephisto и sqlite) 3 Posted by dobrych Sun, 24 Dec 2006 17:09:00 GMT Пока мой блог развивается и читателей у меня не сильно много, позволяю себе немного заняться его наворачиванием и переделкой. В очередной раз решился побороть проблему утечки памяти движка моего блога typo . Суть в том, что по непонятным для меня причинам, rails движок этот тек самым наглым образом (до 200 Мб за сутки). Обидно было больше потому, что на хостинге крутятся еще несколько проектов на rails и у них с памятью все стабильно. В общем долго я плевался на этот typo и решил в итоге попробывать перейти на новый и активно развивающийся движок Mephisto . Мой Typo работал на sqlite базе и поэтому Mephisto я решил ставить тоже на sqlite. Но какое было разочарование после вечера ковыряний и переделываний… Mephisto также противно тек. Отдельно хочу написать о впечатлениях о Mephisto . Движок уже довольно обкатанный, работает нормально. Из typo сконвертировался на раз. Все делал по доке Converting Typo to Mephisto из официальной wiki. Есть уже неплохой набор тем, из которых можно намостырить что-то свое. Единственной проблемой после перехода на Mephisto были поломанные slug у каждого поста. Их видать скрипт переноса тупо ставит в значение title. А русский, как известно, в урлах отображается не совсем читабельно :-) Возвращаясь к теме утечки памяти оказалось, что виноват в этом не typo, а ruby sqlite бекенд к базе. Обидно, но нашел я эту информацию как раз в рассылке Mephisto. После этого я решил сменить базу с sqlite на postgresql и остаться на typo. Но тут оказалось не все так просто. Почему-то база у меня никак не смогла встать красиво . Нехватало sequences в postgresql schema. У меня в запасе были еще два способа добиться результата. Я решил пойти самым простым. Сконвертировал базу в MySQL. Её schema была в порядке. Перенос данных очень удобно делать с помощью скрипта из комплекта Rail Application Installer , называется rails-backup и rails-restore . Данные конвертируются в YAML и потом восстанавливаются в любую базу. Конвертация прошла успешно и я жду что текучка закончится. Если нет, то в запасе есть еще одна идея :-) В дебаггер совсем не хочется лезть :-) надеюсь обойдется. Update : Вторым и последним способом был установка Mephisto на Postgresql, но все обошлось. Так что блог остается под управлением Typo и на базе MySQL. Posted in заметки Tags leak , mephisto , mysql , rails , ruby , sqlite , typo Meta 1 trackback , 3 comments , permalink , rss , atom Просмотр картинок в админке django Posted by dobrych Mon, 18 Dec 2006 18:21:00 GMT Пример как можно просматривать thumbnail-ы в админке django. Достаточно в модели добавить метод image_preview который бы возвращал html-тег . Только нужно включить для метода опцию allow_tags . И добавить этот метод в свойство list_display класса конфигурации админки Admin . См. пример кода. def image_preview(self): return "" % (self.get_image_url()) image_preview.allow_tags = True class Admin: list_display = ('image', 'image_preview',) Posted in заметки Tags admin , django , howto , imagefield , thumbnail , view Meta no trackbacks , no comments , permalink , rss , atom Older posts: 1 2 3 4 5 6 Searching... О блоге Мысли, идеи, задачи и решения по веб-разработке. Взгляд с персональной позиции автора. Об авторе Зовут меня Илья. В рабочее время занимаюсь веб-разработкой. Интересуюсь новыми и модными веб-технологиями. Нерабочее время посвещаю семье, по возможности фотографии и музыке . Подробнее. Tags 2008 ajax conference css development django downshifting exception javascript kiev life python rails ruby syntax typo uaweb update web xml Блогролл Amazon byteflow Маниакальный Веблог Подробно Appleworms Андрей Ясинецкий Собираю блогролл Свежие комментарии by krovati-gostinichnye on Мультисайтовость в django trunk by mybryco on Линкотека №2 by krovati-gostinichnye on Мультисайтовость в django trunk by farinaska on Не изобретая велосипед by semicon on Линкотека №2 Archives May 2008 (2) April 2008 (2) March 2008 (5) February 2008 (2) January 2008 (4) December 2007 (2) November 2007 (2) October 2007 (3) September 2007 (2) August 2007 (4) June 2007 (1) May 2007 (1) April 2007 (3) February 2007 (1) January 2007 (3) December 2006 (4) November 2006 (4) October 2006 (4) September 2006 (3) del.icio.us/dobrych/webdev Design Stencils - Yahoo! Design Pattern Library Набор wireframe для созданию web ui прототипов от Yahoo Natural Docs Софт для генерации документации из кода. Юзабельная дока получается js-ria-tools - Google Code Набор утилит для оптимизации и тестирования JavaScript, возможность минимизации файлов JS mapfish Готовое приложение (клиент и сервер) для работы с гео-данным. Построено на базе Pylons и ExtJS/Openlayers Resizable Polygons Пример создания полигонов с возможностью ресайзинга на Google maps (javascript) Python Package Index : virtualenv 1.0 Скрипт для создания варитуального окружения (модули итп) для Python-приложений Google Maps JavaScript API Example - Snap to Polyline Пример кода для привязки курсора к полигонам и полилиниям Take Control of Your Maps (A List Apart Article) Отличный обзор картографического (GIS) софта для построения веб-приложений Mapstraction - a javascript library to hide differences between mapping APIs. Библиотека JS для работы с многими картографическими сервисами через единый API Modest Maps Библиотека для ActionScript (2/3) и Python для работы с картографическими сервисами Плюшки © livedev.org / powered by typo / styled with clerkly