Публикации о языке Python   страница 392

Нетекстовые символы в XML и HTML

Большнство разработчиков знают, что некоторые специальные символы в XML и HTML необходимо записывать в виде entity или character reference. Но мало кто подозревает, что XML (а также SGML, на котором базируется HTML) документы могут содержать только "текстовые" символы. Привычные питоновские библиотеки также обходят это требование стороной. Средства конструирования XML, которые, казалось бы, должны полностью защищать нас от создания "битых" документов, справляются со своей задачей лишь частично. В результате вполне возможна ситуация, когда библиотека ругается на созданный с её же помощью документ. Вот пример с использованием ElementTree:
>>> from xml.etree import ElementTree
>>> element = ElementTree.Element('element')
>>> element.text = u'\0'
>>> xml = ElementTree.tostring(element, encoding='utf-8')
>>> ElementTree.fromstring(xml)
[...]
xml.parsers.expat.ExpatError: not well-form



Debugging with app-engine-patch and pdb

If you ever tried to use pdb in application written using app-engine-patch, you should notice, that pdb is not working here at all. All pdb output is shown directly in browser. Thanks to Antonin Hildebrand from this thread now we have a way to use pdb for debugging GAE applications. Use following code to put trace in your app:

def b():
import pdb, sys
sys.__stdout__.write('\a')
sys.__stdout__.flush()
debugger = pdb.Pdb(stdin=sys.__stdin__, stdout=sys.__stdout__)
debugge



Задачка для собеседования

Была у меня в своё время любимая задачка для собеседования. Есть веб-страничка принимающая данные от посетителей сайта:
import cgi

form = cgi.FieldStorage()
message = form.getfirst('message', '')
attr = form.getfirst('attr', '')

result = '''<?xml version='1.0'?>
<message attr='%s'>%s</message>''' % (attr, message)
Далее данные отправляются, например, стороннему сервису. Так вот периодически этот сервис нам возвращает ошибку "not well-formed". И предлагаю найти и исправить ошибки. При этом я сразу оговариваю, что задача не столько на знание XML, сколько на умение решать проблемы, возникающие в ходе разработки. Кроме того, я делаю акцент на том, что пользователь может ввести произвольные данные.
Большинство соискателей сходу называют одну ошибку (представление спец-символов) и относительно быстро находят вторую (связанная с кодировкой). А вот третья проблема всегда остаётся незамеченной и "обходит" все предложенные тест



Write in C

Не так давно я довольно круто поменял направление деятельности, чем практически вытеснил язык С++ из своей коммерческой практики. Несмотря на это, я продолжаю его любить и продолжаю использовать в некоторых некоммерческих проектах. Так что, надеюсь, в последующих постах будет как Python, так и С++(не считая всего остального). И как доказательство моей преданности семье С языков, ниже отличный ролик. Улыбнитесь!

Если вы даже после этого не не соглашаетесь, что иногда стоит писать на C, а не, например, Python, предлагаю посмотреть вот сюда




Ставим последнюю bsddb на mac os x leopard

Ввиду нетривиальности действий, публикую рецепт.
-->-->
Сначала запустим sudo easy_install bsddb3 и посмотрим, работает или нет?
У меня ругается, говорит, что нет bsddb.
делаем sudo port install db47
Снова запускаем sudo easy_install bsddb3
Ругается, что include-файлы плохие. Ладно, сделаем вручную
Хорошо, берём путь и идём в ~/Downloads
Вытаскиваем из easy_install путь.
Делаем
wget http://pypi.python.org/packages/source/b/bsddb3/bsddb3-4.7.4.zip
open bsddb3-4.7.4.zip
cd bsddb3-4.7.4/
и
python setup.py install —berkeley-db=/opt/local/lib/db47 —berkeley-db-incdir=/opt/local/include/db47 —berkeley-db-libdir=/opt/local/lib/db47/

P.S.К действиям можете добавлять матов по вкусу.
P.P.S.Если вы используете питон из портов, делайте просто sudo port install py25-bsddb




Python 3.0 и Django

Новое - не всегда означает хорошее. Я когда-то уже писал про IT-гонки глазами программиста. Основная идея поста - не стоит спешить переходить на новее, если в этом нет крайней необходимости. Вот и после очередного релиза Python, правильнее сказать после выхода новой версии языка Python 3.0 захотелось сразу опробоватьвсе гого “вкустности”. Вот только новая версия не полностью совместима с веткой 2.х. Поэтому возникает вопрос на какой версии начинать новые проекты? Популярный web framework[](http://www.




Пару хаков для запуска hgweb и Trac на lighttpd

Есть в lighttpd одна проблемка с переменной PATH_INFO. От параметра "broken-scriptfilename" почему-то толку 0 :.

Вот пару скриптов для запуска Trac и HGweb через fcgi:

  • для запуска Trac в корневом каталоге сайта (нашёл в сети, хотя там была одна ошибка):

try:
        from flup.server.fcgi import WSGIServer
except ImportError:
        from trac.web._fcgi import WSGIServer
from trac.web.main import dispatch_request
import tempfile
import os
os.environ['PYTHON_EGG_CACHE'] = tempfile.gettempdir()



Загрузка файлов в Django. FileField & upload_to.

На момент выхода версии 1.0 Django, одним из самых значительных изменений стал механизм загрузки (upload) и хранения (storage) файлов. Загрузка файлов без FileField в модели базы данных конечно очень редкий случай, поэтому начнем именно с одного из обязательных параметров FileField — upload_to.

Главная инновация — это гибкая возможность настройки этого самого upload_to. Раньше можно было только передавать строку с кодированными strftime параметрами. Тем самым можно было разбивать загруженные файлы по директориям, создаваемыми по дате, типа uploads/mp3/2008-12/uploaded.mp3. Сейчас параметром upload_to может быть и callable, т.е. к примеру функция, которая должна возвращать полный путь с именем файла, куда будет сохраняться загруженный файл. Функция должна принимать два параметра: instance и filename.

  • inst



Бесполезность async серверов в Веб

В предыдущем посте поигрался с асинхронным способом запуска Django через cogen. Как оказал - совершил ошибку :) /me не спец в async-программировании Ниже выскажу своё мнение.

Итак, "асинхронизм" довольно сложная и тонкая штука, которую легко можно нарушить лишь одной синхронной I/O операцией. В тестах на "hellow world" асинхронный метод показал хороший результат, НО в реальных веб-приложениях есть узкое место, а конкретней СУБД. В реальной ситуацие мы получаем, что к базе существует лишь 1 коннект, т.е. django создаёт коннект -> выполняет операцию -> закрывает коннект, и потом опять повторяет данную последовательность. Поэтому на реальном приложении я получил такую ситуацию, что приложения начинало "накапливать" запросы к бд, и как-бы выставляло их в очередь и выполняло последовательно через 1 коннект. Хотя у psycopg2 и есть async API, но в django ORM данная поддержка отсутвует.

При запуске через cherrypy мы имеем тр




Python 3 final

Вышел Питон 3, всех питоноводов поздравляю с данным событием.