Как оказалось в питоне нет однозначно подходящего варианта. Всего-то хочется удобно дергать какие-то API и иногда стягивать файлы.
Есть несколько библиотек, многие из которых друг друга используют и заимствуют функционал. Но вот чего-то одного, удовлетворяющего достаточно простым (ведь так?) требованиями, нет.
Требования же эти такие:
поддержка http/https
возможность использовать любые http verb
возможность отослать body запроса с произвольным Content-Type
поддержание коннекта между запросами (keep-alive)
работа с куками
стандартная аутентификация
file-like интерфейс к body ответа
кеширование
conditional get
обработка низкоуровневых ошибок и оборачивание их в какой-то дженериковый HTTPError и наследников.
возможность добавить в конвейер запроса хуки, чтобы можно было какие-то действия производить с отсылаемыми данными, либо результатом.
возможность задать таймаут хотя бы для соединения
Ну и пара экзотических хотелок:
поддержка http pipelinening
возможность делать запросы асинхронно
Ведь не невозможного хочется. Но что мы имеем.
httplib
По сути основа всех питонячих "ходилок" по http. Находится в стандартной библиотеке. Главная особенность -- позволяет присоединиться к http серверу и делать запроса к его урлам в рамках одного соединения.
connection = httplib.HTTPConnection('example.com')
result = connection.request('GET', '/foo')
# ...
result = connection.request('GET', '/bar')
# ...
connection.close()
Возвращает file-like объект и с недавних пор позволяет задать таймаут для соединения. Тут фичи заканчиваются и мы остаемся наедине ...
Недавно на форуме случился топик посвященный извечной проблеме всех питонистов -- кодировкам. Человек жаловался на то, что у него в программе получаются строчки вида:
Вы заметили что что-то не так? И я вот. Строчки как бы уникодные, но внутри них закодированные utf-8 байты. Что-то pдесь не так. Разбираясь дальше и потребовав скрипт, которые такое генерирует, становится понятно, что данные берутся из веба. Вполне обычным способом через urllib и потом скармливаются в lxml.html для разбора. Поскольку urllib оперирует только байтовыми строками, то он не мог их так превратить в уникод, а значит во всем виноват lxml.
Вообще lxml очень крутая библиотека - и быстрая, и функциональная, и умеет мимикрировать интерфейсом под ElementTree, и взаимодействовать с BeatifulSoup. Она давно уже пользуется популярностью у питонистов, когда надо как-то удобно работать с xml.
Но тут немного другой случай. Тут используется парсер html. И именно в нем происходят эти неприятные метаморфозы со строками.
Я решил понять в чем же всё-таки и дело и как побороть такое поведение.
Для начала, я сходил на http://yandex.ru/ и посмотрел что за html там отдается. Кодировка контента utf8. Сразу что бросилось в глаза -- это ...
Пора нарушить молчание и рассказать о том, что на недавней замечательной конференции 404fest я тоже имел честь выступать с докладом. Посвящен он был модной ныне теме - NoSQL. Доклад получился коротким и поэтому больше политическим чем техническим. Я хотел показать, что этот новый тренд не просто так захватывает умы всё большего числа разработчиков.
Это только первое моё выступление на эту тему, но, я надеюсь, что в скором времени последуют другие на новых площадках
Вам не кажется, что чем большее распространение получаются всякие фреймворки для быстрого создания веб-приложений, то всё большему числу людей кажется, что можно "за один вечер" сделать какой-то сайт и это получится хорошо, интересно и полезно. Нет, так не бывает.
Сейчас я хочу немного порассуждать про сайты-сообщества, например Питона, Джанги или любой другой любимой вами технологии/языка. Это очень похвально, что люди готовы только на энтузиазме (ну или почти только на нем) продвигать продукт, которым они пользуются. Но зачем это делать "как все" и совершенно неэффективно, наступая на всё те же грабли из раза в раз?
Сто есть на каждом сайте какого-либо сообщества?. Агрегатор блогов - так называемая "планета". Но многие уже разочаровались в таком способе в одной ленте получать записи из разных источников. Главная проблема - это автоматическая суть таких агрегаторов. Т.е. авторы чьи блоги входят в эту ленту могут вдруг начать писать что-то совсем отвлеченное или банально неинтересное и что делать? Отписываться от планеты целиком? Не очень удобно, но нет выбора, если кто-то действительно в неё "спамит" и захламляет ваш ридер.
Как показывает практика, гораздо лучше ручные агрегаторы. Все наверно читают Саймона Виллисона и регулярно ходят по интересным ссылкам на какие-то статьи или проекты из его постов. Такого уровня качества ...
Беру небольшую передышку в своих изысканиях о композитных полях для большего прилива вдохновения. Подамся-ка я в другую область на время.
Представим себе ситуацию(а лучше вспомним один из прошлых проектов, который вы делали:)), что есть пара приложений от сторонних разработчиков. И это не какие-то совсем простые приложения, а что-то более комплексное. А отличительной чертой их комплексности будет наличие в каждом своей модели профиля. Ведь было такое? Увы, было. Ну и пусть будут, только вот ещё незадача - их поля являются пересекающимися множествами. Ну т.е. и в том и в другом есть, допустим, поле с ссылкой на сайт владельца. И что же делать? Конечно, для облегчения работы интерфейс редактирования информации профиля один для выбранного основного профиля. А объектов профиля закрепленных за пользователем два (а может быть и больше, если проект используем много разных приложений). Надо как-то синхронизировать данные...
Вообще ситуация того, что в каждом мало-мальски большом приложении свой профиль - это как бы уже давно проблема. И тут ничег уже не поможет. Универсальный профиль помещенный в contrib, конечно, может как-то решить её, но не всегда. Да и потом, с профилем разберемся, так что-то другое появится. Надо находить универсальные пути решения.
Кстати, обсуждения данной темы были как на неформальной встрече джангистов по поводу ...