Библиотека для sape - рефакторинг

Так получилось, что я в очередной раз переписал библиотеку для работы с биржей ссылок sape.ru. В течение нескольких месяцев я пользовался библиотекой linkexchange, про которую уже писал раньше. Плюсы linkexchange — автор оперативно фиксит глюки. Минусы — глюки есть, за время использования я наткнулся на три штуки, о которых прямо или косвенно были посланы багрепорты. Свои глюки роднее — я решил вернуться к использованию самописаного модуля, первую версию которого я разработал ещё год или два назад. Как всегда переписал всё с нуля. Гавное отличие новой версии библиотеки от прежних — я отказался от обновления локальной базы ссылок прямо в коде сайта при обработке чьего-либо запроса. Ноги этого подхода растут из PHP-библиотеки, в которой такой подход оправдан т.к. позволяет использовать библиотеку большому количеству веб-мастеров, даже тем, кто не знает что такое cron и с чем его едят. В моём же случае мне наплевать на людей, которые не умеют использовать cron, поэтому я разделил библиотеку на две части: client и provider. Provider умеет обращаться к серверу sape.ru, забирать оттуда дамп базы данных, парсить его и сохранять локально в формате эффективном для быстрой выборки данных. А client это оочень маленький код, который просто умеет по данному ключу делать выборку данных, по сути, можно обойтись и вовсе без клиента т.к. всё равно всё сводится к вызову функции sape.provider.Provider::read_database_key. Таким образом теперь глюки sape.ru сервера не влияют на работу сайта т.к. базу обновляется скриптом, вызываемым по крону. Другое новшество библиотеки — я храню локально ссылки в DBM-базе, с которой работаю через модуль anydbm. Все говорят, что этот dbm — быстрая штука, если честно, я ещё не проверял :D Но должно быстрее быть старого подхода, когда я каждый раз считывал в память сохранённый дамп, десерилизовывал его с помощью библиотеки phpserialize и только затем уже искал нужный ключ.

Подробности о том, как использовать библиотеку в Django и неDjango проектах, читайте в README

Сорцы как всегда на битбакете. А ещё я научился оформлять distutils-пакеты и регистрировать их на PyPI. Так что либу можно ставить также через easy_install и pip. Обо всех глюках просьба писать на мыло.

Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Comments

Только ваша библиотека поднялась у меня, только предыдущая версия. Еще бы либы для uniplace и xap. :)

Доброжелатель 9.11.2009 18:41

Есть такое слово “кеширование”, хотя, конечно, Вы вправе использовать и “велосипед”. Решение, хоть и работает, но неизящно: а) много ненужных зависимостей, б) в то время, как задача ультра-проста, код — too sophisticated, в) это не есть pluggable django application.

Код гавно, автор мудак. Понятно :)

Спасибо за библиотеку — только ее получилось завести :)) Причем и то — использую вручную, благо это оч просто.

     from sape.client import Client
     uri = request.build_absolute_uri()
     uri = str(uri)
     client = Client('linksdb/test.db', uri)
     sapelinks = client.links()

т.к. на автомате хоть убейся — не выводится <check code> а вручную к каждому представлению добавляю этот код — и все пашет. Так и не смог понять причины, почему не работает на автомате… PS: да и кстати

$ ./manage.py sape_refresh Unknown command: ‘sape_refresh’ Type ‘manage.py help’ for usage.

Пробовал устанавливать как через easy_install так и через setup.py

Да, мне уже писали про этот баг. Поковыряюсь на досуге. Странно, у меня работает всё ок.

aaleksander 27.02.2010 11:29

У меня почему-то выводит сообщение: “TypeError: sape() takes exactly 1 argument (0 given)” Отключил процессов, ссылки выбираю рукам. Передаю в шаблон переменную links. В шаблоне пишу: {{ links|safeseq|join:”, “ }}

Вопрос: этого достаточно, чтобы sape засчитал ссылку или он еще каким-то образом проверяет ее наличие?

да, главное сам код ссылки не менять

aaleksander 27.02.2010 14:01

Не понял, что подразумевается под кодом ссылки?

В базе, которая скачивается с сервера sape.ru ссылки хранятся в виде HTML кода тэга a, например

<a href="http://ya.ru">скачать фильм дориан грей</a>

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

А разве сапа не банит за редактирование ссылок, которые она отдает. Имхо тут можно и перекрутить

aaleksander 18.03.2010 16:16

Сижу, курю исходники. Но к сожалению знаний anydb на хватает. функция:<br> def read_database_key(path, key): db = anydbm.open(path) try: value = db[key] except KeyError: value = db.get(‘__sape_new_url__’, ”) value = value.split(DB_DELIMITER) return value Я правильно понял. Если вызвать Client.links() с пустым параметром, то он вернет какие-то новые урл? Вообще хочу сделать такую штуку, чтобы при заходе на некий секретный адрес у меня дергался refresh_local_database и выводилось окно со статистикой: сколько всего ссылок, сколько новых, их список и т.п. Вопрос, такой код будет работать: old_links = Client(‘var/links.db’, ”).links() refresh_local_database …. new_links = Client(‘var/links.db’, ”).links()

и тут сравниваем old_links и new_links и выводим?

Спасибо за библиотеку :-)

aaleksander 18.03.2010 16:17

не понял, как текст форматировать, извините.

Не очень понял про параметр :) У links() нету параметров он возвращает информацию для url, который был передан в конструкторе. Просто если такой url не был найден в базе данных (новые страницы у вас на сайте или просто ни одной ссылки ещё не куплено на странице), то будет взято дефолтное значение, а дефолтное значение в дампе сапы хранится для псевдоадреса равного “___sape_new_url__”. В общем links() возвращает не все ссылки, а только ссылки для текущей страницы. Если вы хотите “сделать diff” старой и новой базы, то эээ… ну прочитайте как работает anydbm и сделайте :)

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image