Библиотека для упрощения 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
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 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()
                                    

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