Пользователь
57,4
рейтинг
14 августа 2011 в 11:16

Разработка → Библиотека для упрощения HTTP-запросов

Requests — библиотека Python, которая элегантно и просто выполняет HTTP-запросы. Теперь не нужно осваивать urllib2 с излишне сложными программными интерфейсами.

Вот как выглядит HTTP-запрос с авторизацией с помощью requests:

>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json'

Для сравнения, вот HTTP-запрос urllib2:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib2

gh_url = 'https://api.github.com'
gh_user= 'user'
gh_pass = 'pass'

req = urllib2.Request(gh_url)

password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, gh_user, gh_pass)

auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)

urllib2.install_opener(opener)

handler = urllib2.urlopen(req)

print handler.getcode()
print handler.headers.getheader('content-type')

# ------
# 200
# 'application/json'

Библиотека requests позволяет отправлять HTTP-запросы HEAD, GET, POST, PUT, PATCH и DELETE. Все заголовки и параметры добавляются очень просто, также и обработка ответов сервера. Разумеется, requests работает на базе urllib2, но берёт на себя всю сложную работу.

Исходный код requests на github, под открытой лицензией ISC
Документация
Requests API
Анатолий Ализар @alizar
карма
751,5
рейтинг 57,4
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (32)

  • +3
    Спасибо, давно хотел что то подобное
    • +5
      Соглашусь! Вспоминаю, как я мучился с urllib2
  • +9
    Достаточно удобно. Но ИМХО код для urllib2 раздут. Количество строк можно ужать раза в 3. Хотя, конечно, элегантности как в 1м примере добиться не получится.
  • +1
    Еще есть httplib2, среди авторов люди из Nokia, Google и т.п.
    • +1
      Переусложненная и глючит. Пришлось форкать couchdb-python, что б избавится от нее (перешел на cURL).

      cURl тоже не подарок в плане api, но зато очень стабильная.
      • 0
        для pycurl есть такая обёртка packages.python.org/grab/
        • 0
          Оно совсем маленькое и сыроватое (с виду). В частности, мне нужны HEAD/POST/PUT/DELETE-запросы.
          • 0
            Ну вообще я grab уже года 3-4 юзаю. Много задач им решал. С точки зрения документации сырой, да.
            Вот быстроенько протестировал — он умеет слать нужные запросы. dumpz.org/76084/
            Я работал только с get/post, put/delete/head никогда не нужны были.
            Что вы имели в виду под «совсем маленькое» я не очень понял.
            • 0
              API куцое (или не туда смотрел?), пара методов и все.

              Мне достаточно своей простенькой обертки над pycurl, в общем-то.

              P.S. HEAD-запросы требуют немного другой инициализации в cURL (надо отключить ожидание тела ответа). В остальном хз. Просто мне не нужно :)
              • 0
                Не туда смотрели, надо в сорцы смотреть :)

                > P.S. HEAD-запросы требуют немного другой инициализации в cURL (надо отключить ожидание тела ответа)

                Так там так и сделано, опция NOBODY выставляется: bitbucket.org/lorien/grab/src/9f1d856bba3d/grab/ext/pycurl.py

                Да просто решил засветить либу, может кому-то пригодиться и хватит терпения разобраться. Документация хромает, она у меня не в приоритете. Мои личные нужды grab полность покрывает.
                • 0
                  Чё-то хабропарсер выжрал hash-часть из ссылки. Строку под номером 131 там надо смотреть.
                • 0
                  > Так там так и сделано, опция NOBODY выставляется:

                  А, точно, пропустил. Ладно, посмотрим, может где и заюзаю.

                  Вообще, по хорошему, стоило бы привести в порядок pycurl. А то в нем есть _curl для низкоуровневых операций и curl для типа высокоуровневых, но при этом половину апи потеряли, а то что сделали — через одно место, совсем не pythonic-way.

                  А держать враппер поверх враппера мне совесть не позволяет.
      • 0
        Согласен. libcurl пусть и не подарок, но я для себя под него написал мелкую библиотечку-обертку и теперь код выглядит нагляднее и элегантнее.
        И оно того стоит в плане скорости, keep-alive, компрессии у libcurl и много другого вкусного.
        Перешел на libcurl года три-четыре назад и до сих пор доволен.
  • 0
    Я так понимаю эта библиотека частично обертка над urllib2?
  • 0
    Можно попробовать как REST клиент использовать.
  • +3
    Слабоватое описание, принципиальные вопросы не затронуты. Например, поддерживает ли она сессии.
    • +1
      Да и библиотека слабоватая, нет digest auth, ntlm.
  • 0
    Забавно, я когда-то делал нечто похожее (libhttp)
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Вот это дзен-питон!
    • 0
      В чём тут дзен-питон?
      • +2

        Простое лучше, чем сложное

        Читаемость имеет значение.

        • 0
          Удивительно тогда, что в самом Пайтоне куча модулей для работы с HTTP и ни одного читаемого и простого.
          • +4
            ничего удивительного — подозреваю, что их писал не Сам, а залетные жависты.
  • 0
    Использование синглетонов — не самая светлая идея
    • +1
      где вы синглтоны видите?
      • 0
        А вы в код авторизатора и proxy смотрели?
        • 0
          Извиняюсь — до конца не долистал
  • +17
    alizar продал перса))
  • 0
    Хомяки-дизайнеры в восторге.
  • 0
    Код с urllib2 излишне раздут. Если не заморачиваться с аутенфикацией, то дерганье урлов решается одной строкой:

    import urllib2
    
    response = urllib2.urlopen("http://example.com")
    print response.code, response.read()
    


    Кстати, умеет ли сабж определять тип аутенфикации прокси, как это умеет cURL?
    • 0
      А если продолжать спец. олимпиаду по упрощению кода на urllib2, то даже с аутентификацией будет достаточно кратко:

      handler = urllib2.HTTPBasicAuthHandler()
      handler.add_password('', 'https://api.github.com', 'user', 'pass')
      response = urllib2.build_opener(auth_handler).open('https://api.github.com')
      print response.code, response.read()
      

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.