Библиотека для упрощения 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
    Метки:
    Поделиться публикацией
    Комментарии 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()
                                    

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