четверг, 17 апреля 2008 г.

события при обработке cgi,*sql данных в Python

При выводе данных из *sql таблицы или cgi запроса, да хоть при обработке xml файла, можно включить систему событий для обработки отдельных полей, возможно это велосипед, но я не нашёл способа лучше.
Короче делаю так:

# добавляет XML тег защиты от XSLT процессора
def make_cdata(str):
return "защита от"+str+"xslt процессора"

# создаю кортеж со значениями имя поля - имя функции обработчика
# для поля MESSAGE применится функция
make_cdata, защищающая её от XSLT процессора
# для поля ID будет проведенно преобразование к типу int
event = {"MESSAGE":make_cdata,"ID":int}

# затем, передаю этот вектор в обработчик cgi,sql,xml, да куда угодна
if bd_sql.execute(sql)> 0 :
xml = bd_sql.get_xml(root="post",event)

# а в этом обработчике пишу код:
# тут, например, присутвует код перебора выбранных строк, скорее всего
# велосипед, и вставку в xml шаблон, но

xml_str="<%s>"%root
for i in range(0,self.__res__):
row = self.__curs__.fetchone()
rt={}
# генерация XML документа
for i in range(len(fields)):
try:
# от тут магия, если имеется поле с именем как в векторе собитий
# то к значению поля применяется заданная нами функция
rt[fields[i]]=event[fields[i]](row[i])
except:
rt[fields[i]]=row[i]
xml_str+=xml_str_tmpl%rt
return xml_str+""%root

мне понравилось такое компактное решение, особенно если представить сколько надо навелосипедить на С++
Я собираюсь такой приём можно применить для обработки входящих сообщения на наличие ключевых слов, ссылок, да мало ли чего, это просто удобно.