This version of the page http://livedev.org/ (0.0.0.0) stored by archive.org.ua. It represents a snapshot of the page as of 2007-07-27. The original page over time could change.
livedev.org

Перевод интерфейса Typo на русский 3

Posted by dobrych Wed, 06 Jun 2007 23:45:00 GMT

Я практически закончил сабж. Осталось немного согласовать с trunk-ом. Если кому-то интересно попробывать beta-версию, напишите мне на dobrych [at] gmail.com. Интересно Ваше мнение прежде чем буду выкладывать в общее пользование.

  • Posted in заметки
  • Tags interface, russian, translation, typo
  • Meta no trackbacks, 3 comments, permalink, rss, atom

XML-сервисы на Python. Часть первая. Создание и парсинг XML. 2

Posted by dobrych Wed, 02 May 2007 08:12:00 GMT

Недавно второй раз на практике столкнулся с серьезной задачей по работе с XML на Python. И второй раз был расстроен. К сожалению не все просто в Python настолько, насколько хотелось бы.

Говоря в общем, встроенная в последний Python (2.5) ElementTree не совсем хороший выбор, как по мне, для полноценной работы с XML. С помощью ElementTree удобно создавать XML-документы, но никак не парсить. Я был удивлен, что такая простая задача как принять XML-документ из переменной—окажется такой замороченной… ElementTree заточен для парсинга файлов (т.е. ему нужно передавать при открытии или путь или уже открытый файл). В моем случае я уже имел переменную из HTTP-запроса, обработанного Django. Несколько часов я плясал с бубном, сначала чтобы заставить принять XML-документ из переменной, потом уже с самим парсингом и получением аттрибутов тегов. В общем убил много времени впустую, что очень неприятно. В довесок ко всему общеизвестный факт что ElementTree имеет очень ограниченную документацию, поэтому время было потрачено дополнительно на гугление и ковыряние в его сырцах.

Хочу отметить что создание XML-документа с помощью ElementTree оказалось достаточно простым и удобным. А начинали мы именно с создания, поэтому и парсинг позже пытались делать тем же ElementTree.

В итоге, после всей возни, я решил для парсинга использовать отдельную библиотеку—Beautilful Soup. И работа сразу пошла очень быстро. Главное достоинство Beautilful Soup—это практически полная сериализация XML-документа в объекты Python. Что очень хорошо отражается на читаемости кода и очень удобно при отладке. Насчет создания документов с помощью Beautilful Soup, ничего сказать не могу, т.к. небыло времени для себя потестировать.

Из прошлого своего опыта также добавлю, что есть еще одна библиотека для работы с XML на Python—lxml. Она базируется на Cи библиотеках libxml и libxslt. Которые в свою очередь используются в большом количестве unix-приложений и других скриптовых языках. Прошлая моя задача была свзязана с выборкой данных из XML-документов с помощью Xpath. Так вот lxml и в частности libxml имеет хорошую и удобную реализацию Xpath. Так что рекомендую.

PS: Все написанное выше—сугубо личное мнение, на которое в принципе имею право :)

Ниже примеры кода.

# пример парсинга XML через Soup
from BeautifulSoup import BeautifulStoneSoup as Soup

def some_view(request):
    message = Soup(request.raw_post_data)
    some_obj = Obj(content = message.body.string, phone = message.sin.string)
    # message.body - body это xml тег
# пример создания XML-документа
import elementtree.ElementTree as ET

# создаем документ
root = ET.Element("message") # рутовый элемент <message>
root.set("rid", "7idfndsi9s") # устанавливаем ему аттрибут
sn = ET.SubElement(root, "sn")
sn.text = "1039303"
body = ET.SubElement(root, "body")
body.set("content-type","text/plain")
body.text = "somte text content"
message = ET.tostring(root)
Вот такой код генериться (из предыдущего примера)
<message rid="7idfndsi9s">
 <sn>1039303</sn>
 <body content-type="text/plain">somte text content</body>
</message>
  • Posted in статьи
  • Tags elementtree, python, service, soup, xml
  • Meta no trackbacks, 2 comments, permalink, rss, atom

Проверка HTTP-запроса на аяксовость (ajax) 2

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 и реализовано как клиентами так и серверами. Есть такой заголовок в стандарте HTTPVary:, обычно его называют 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, 2 comments, permalink, rss, atom

Подкасты про webdev 1

Posted by dobrych Wed, 18 Apr 2007 14:06:00 GMT

Последнее время стал увлекаться подкастами. К сожалению русскоязычных качественных очень мало. А на тему веб-разработок вообще нет (поправьте если ошибаюсь).

Хочу привести свою подборку англоязычных подкастов, которые слушаю.

  1. Начну с наиболее интересного для меня—Hivelogic Radio. В этом подкасте автор концентрируется на веб-разработке, как на дизайне так и на программировании. Очень интересные интервью с интересными людьми. В разработке есть акцент на Ruby on Rails. Со стороны аудио, подкаст сделан очень качественно. Приятно слушать.
  2. Следующий подкаст я слушаю не так давно, но у него довольно большой авторитет—FOO Casts: Podcasts from O’Reilly & Friends В нем освящается много технических вопросов, необязательно связанных с вебом, но все равно полезных для любого гика и разработчика. Качества звука тоже на высоте.
  3. Inside Silicon Valley—Подкаст, состоящий в основном из интервью с монстрами и просто успешными людьми из Силиконовой Долины. Качество хорошее, слушать интересно.
  4. Python411 Podcast—для фанов Python. Качество звука не впечатляет, но темы и интервью довольно интересные. Так что подкаст пожалуй действительно для фанатов Python. Освящаются вопросы не только веб-разработки, но и других специализаций в программировании.
  5. WebDevRadio—Действительно настоящий подкаст именно для веб-разработчика. Обсуждение новых технологий в вебе, интервью, относительно часты обновления. Советую.
  6. 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 и заметный прогресс в том, что есть встроенная возможность локализации.

Процесс переезда прошел прозрачно, почти без бубна и плясок :-) Итак пошагово, для тех, кто будет повторять:

  1. Бекапим базу в двух вариантах—SQL-дамп и сериализованный YAML вариант. Первое делается через mysqldump или phpmyadmin, а второй вариант командой rails-backup в директории с rails-проектом блога.
  2. Обновляем rails и typo. Т.к. у меня все работает через rubygem, я просто запустил sudo gem update. После чего получил последние стабильные gems.
  3. Останавливаем текущий процесс typo. Переименовываем директорию проекта и создаем заново проект с typo—typo install my_typo_dir
  4. Переносим конфиги из старой в новую директорию (обычно это database.yml и mongrel_cluster.yml). И обновляем базу rake db:migrate.
  5. После чего запускаем проект (у меня он работает через 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: работа с несколькими версиями

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-окружении:
  1. PYTHONPATH=’path_to_Django_project
  2. DJANGO_SETTINGS_MODULE=my_project.settings

После этого в любой директории набераете python или ipython и делаете импорты из моделей и работаете с ними.

  • Posted in заметки
  • Tags debug, django, env, path, python, shell
  • Meta no trackbacks, no comments, 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 блога всё свелось к нескольким манипуляциям.

  1. регистрация на myopenid
  2. создание yadis.xrdf файла
  3. конфигурация apache
  4. добавлении строчки кода в хидер темплейта блога
Вот мой yadis.xrdf

<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)" 
  xmlns:openid="http://openid.net/xmlns/1.0">
  <XRD>
    <Service priorioty="1">
      <Type>http://openid.net/signon/1.0</Type>
      <URI>http://www.myopenid.com/server</URI>
      <openid:Delegate>http://dobrych.myopenid.com/</openid:Delegate>
    </Service>
  </XRD>
</xrds:XRDS>
Вот строки для конфигурации апача:

  # 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
Вот строка, добавленная в шаблон

<meta http-equiv="X-XRDS-Location" content="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

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, no comments, permalink, rss, atom

Older posts: 1 2 3