Пишу на python, javascript
использую фреймворки django, jquery
по вопросам сотрудничества пишите devex.soft@gmail.com
четверг, 1 апреля 2010 г.
четверг, 11 февраля 2010 г.
Python sax парсинг, осторожно грабли!
Столкнулся с такой проблемой использую SAX парсер для парсинга XHTML файла и прикаждом вызове функции xml.sax.parse скрипт подвисает на несколько секунд. В начале думал что файл слишком тяжёлый для парсинга, посмотрел загрузку процессора, процессор не грузится! Забил, через несколько дней сижу с вырубленым интернетом, запускаю скрипт и вот тут выскакивает ошибка мол время соединения истекло т.е. таймаут!!! И ошибка указывает на строку 298
Оказалось что в XHTML файле есть доктип:
и каждый раз при парсинге скрипт рубится в интернет!!!
f = urllib.urlopen(source.getSystemId())модуля saxutils. Вот тут я выпал в осадок :))))
Оказалось что в XHTML файле есть доктип:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
и каждый раз при парсинге скрипт рубится в интернет!!!
Погуглив, решения не нашёл как это дело закешировать, не стал рефакторить фукцию prepare_input_source, которая как раз отвечает за выборку доктипа, а просто регепсом _pat_dtd = re.compile(r'<!doctype [^>]+>' re.I) убиваю доктип и парсю через parseString, всё!
суббота, 31 октября 2009 г.
Допиливаем "красивую композицию"
Недавно наткнулся на заметку Красивая композиция от Александра Кошелева (репка) всё было замечательно до момента, когда есть зависимая модель, но определена она ниже по коду. То тут возникает трудность пока модель не подхвачена джангой к модели нельзя подключить обработчик/триггер. Собственно, я немного покопавшись в коде написал небольшой хак, который устраняет данную проблему:
- так как указать модель можно sender_model='app_label.Model', то при поиске данной модели функция models.get_model вернет None, т.к. модель не была найдена.
- для устранения проблемы нужно все триггеры, которые не нашли модель для подключения внести в список ожидания.
- а для того чтобы присоединить ожидающие триггеры нужно подключится к сигналу class_prepared и ждать когда искомая модель будет найдена.
from django.db import models
from django.db.models.signals import class_prepared
from django.utils.itercompat import is_iterable
_wait_triggers = []
def _connect_trigger(sender, **kwargs):
connected = []
for trigger in _wait_triggers:
model = models.get_model(*trigger.sender_model.split('.', 1))
if model:
trigger.sender = model
trigger.sender_model = model
trigger.wait_connect = False
trigger.connect()
connected.append(trigger)
for trigger in connected:
_wait_triggers.remove(trigger)
class_prepared.connect(_connect_trigger)
class Trigger(object):
def __init__(self, do, on, field_name, sender, sender_model, commit,\
field_holder_getter):
self.freeze = False
self.field_name = field_name
self.commit = commit
self.wait_connect = False
if sender_model and not sender:
if isinstance(sender_model, basestring):
model = models.get_model(*sender_model.split(".", 1))
if model is None:
self.wait_connect = True
_wait_triggers.append(self)
else:
sender = sender_model = model
self.sender = sender
self.sender_model = sender_model
else:
self.sender = sender
self.sender_model = sender_model
if not do:
raise ValueError("`do` action not defined for trigger")
self.do = do
if not is_iterable(on):
on = [on]
self.on = on
self.field_holder_getter = field_holder_getter
def connect(self):
"""
Connects trigger's handler to all of its signals
"""
if not self.wait_connect:
for signal in self.on:
signal.connect(self.handler, sender=self.sender)
def handler(self, signal, instance=None, **kwargs):
"""
Signal handler
"""
if self.freeze:
return
objects = self.field_holder_getter(instance)
if not is_iterable(objects):
objects = [objects]
for obj in objects:
setattr(obj, self.field_name, self.do(obj, instance, signal))
if self.commit:
obj.save()
воскресенье, 18 октября 2009 г.
Мой небольшой вклад в open source
среда, 19 августа 2009 г.
classproperty - свойство класса
Иногда нужно чтобы у класса было некое свойство, а декоратор property в данном случае не подходит.
Тогда я написал небольшой дескриптор:
Используется также как и декоратор property:
Тогда я написал небольшой дескриптор:
class classproperty(object):
def __init__(self, func):
self.func = func
def __get__(self, instance, cls):
return self.func(cls)
Используется также как и декоратор property:
class A(object):
@classproperty
def name(cls):
return cls.__name__
A.name # вернёт имя класса
среда, 6 мая 2009 г.
pylibcurl - обёртка ctypes для curl'a
привет, любители питона.
представляю вам обёртку ctypes для курла, теперь не нужно ставить pycurl :)
особенности:
пример:
в планах написать больше тестов, отловить баги, написать документацию
жду ваши пожелания, замечания, критику приветствую :)
ах, да чуть не забыл ссылка на pylibcurl
представляю вам обёртку ctypes для курла, теперь не нужно ставить pycurl :)
особенности:
- более питонически стиль
- работает из "коробки" не нужно ставитьт pycurl (нужна только библиотека libcurl)
- работает со stackless'ом (возможна работа на greenlet'ах (не тестировал) c эмуляцией или без stackless'а)
пример:
from pylibcurl import Curl, const, lib, CurlError
header = []
c = Curl() # или все опции вставить в конструктор c = Curl('http://www.yandex.ru', followlocation=1, maxredirs=20, encoding='')
c.url = 'http://www.yandex.ru'
c.setopt(followlocation=1, maxredirs=20, encoding='')
c.httpheader = ['X-Client: 1', 'Bot: 1']
c.httpheader = ['X-Client: 2', 'Bot: 2']
c.useragent = 'Opera' # или таким образом устанавливаем опции
c.autoreferer = 1
cookie_file = 'cookie.txt'
c.cookiefile = cookie_file
c.cookiejar = cookie_file
c.writefunction = lambda x: x
c.headerfunction = header.append
c.verbose = 0
c.perform()
print c.effective_url # думаю смысл понятен
в планах написать больше тестов, отловить баги, написать документацию
жду ваши пожелания, замечания, критику приветствую :)
ах, да чуть не забыл ссылка на pylibcurl
среда, 3 декабря 2008 г.
Подписаться на:
Сообщения (Atom)