Александр Кошелев
Александр Кошелев Python-разработчик

Чем ходить по http?

Как оказалось в питоне нет однозначно подходящего варианта. Всего-то хочется удобно дергать какие-то 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 объект и с недавних пор позволяет задать таймаут для соединения. Тут фичи заканчиваются и мы остаемся наедине с низкоуровневым интерфейсом.

urllib2

Стандартная высокоуровневая обертка над httplib представляющая из себя конвейер хендлеров, в которых можно организовать пре- и пост-процессинг запроса и ответа. Хендлеры также позволяют ходить не только на http ресурсы, но и на ftp, и в файловую систему. Хендлерами так же делается обработка кук и кеширование.

Поскольку это обертка над HTTPConnection, то ответ получается тоже в file-like объекте. Но создать keep-alive соединение не дадут и задать таймаут стало возможно только недавно.

httplib2

Сторонняя разработка претендующая на универсальность и поддержку уникальных фич. Поддерживает кеширование, поддержку авторизации и обработку редиректов. Умеет держать коннект. Основная проблема – пытается загнать весь ответ в строку и вернуть её. Не имеет стандартных способов внедрения middleware.

pycurl

Поскольку этот питонячий биндинг предоставляет практически голый интерфейс, то главная проблема – API ужасен и приходится какие-то свои враперы писать на каждом углу. Хотя потенциально умеет всё.

***

В сухом остатке факт – инструментов казалось бы много, но ни один не удовлетворяет всем требованиям. Идеальным решением было какое-то объединение всех перечисленных библиотек в одну. Либо на базе httplib/pycurl реализация высокоуровневой обертки, которая соответствовала бы требованиям. Но таких нет.

Кто виноват и что делать?

comments powered by Disqus