Библиотека для 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. Обо всех глюках просьба писать на мыло.






Comments
Только ваша библиотека поднялась у меня, только предыдущая версия. Еще бы либы для uniplace и xap. :)
Есть такое слово “кеширование”, хотя, конечно, Вы вправе использовать и “велосипед”. Решение, хоть и работает, но неизящно: а) много ненужных зависимостей, б) в то время, как задача ультра-проста, код — too sophisticated, в) это не есть pluggable django application.
Код гавно, автор мудак. Понятно :)
Спасибо за библиотеку — только ее получилось завести :)) Причем и то — использую вручную, благо это оч просто.
т.к. на автомате хоть убейся — не выводится <check code> а вручную к каждому представлению добавляю этот код — и все пашет. Так и не смог понять причины, почему не работает на автомате… PS: да и кстати
$ ./manage.py sape_refresh Unknown command: ‘sape_refresh’ Type ‘manage.py help’ for usage.
Пробовал устанавливать как через easy_install так и через setup.py
Да, мне уже писали про этот баг. Поковыряюсь на досуге. Странно, у меня работает всё ок.
У меня почему-то выводит сообщение: “TypeError: sape() takes exactly 1 argument (0 given)” Отключил процессов, ссылки выбираю рукам. Передаю в шаблон переменную links. В шаблоне пишу: {{ links|safeseq|join:”, “ }}
Вопрос: этого достаточно, чтобы sape засчитал ссылку или он еще каким-то образом проверяет ее наличие?
да, главное сам код ссылки не менять
Не понял, что подразумевается под кодом ссылки?
В базе, которая скачивается с сервера sape.ru ссылки хранятся в виде HTML кода тэга a, например
Когда я раньше менял аттрибуты тэга, вырезал-добавлял, не помню, в общем, сапа не видела ссылку. А что вокруг ссылки — это не важно, насколько я знаю.
А разве сапа не банит за редактирование ссылок, которые она отдает. Имхо тут можно и перекрутить
Сижу, курю исходники. Но к сожалению знаний 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 и выводим?
Спасибо за библиотеку :-)
не понял, как текст форматировать, извините.
Не очень понял про параметр :) У links() нету параметров он возвращает информацию для url, который был передан в конструкторе. Просто если такой url не был найден в базе данных (новые страницы у вас на сайте или просто ни одной ссылки ещё не куплено на странице), то будет взято дефолтное значение, а дефолтное значение в дампе сапы хранится для псевдоадреса равного “___sape_new_url__”. В общем links() возвращает не все ссылки, а только ссылки для текущей страницы. Если вы хотите “сделать diff” старой и новой базы, то эээ… ну прочитайте как работает anydbm и сделайте :)