Как отправить файл post запросом python
Установка requests
Установить этот пакет, как и большинство других пакетов Python, довольно просто. Вы можете либо загрузить исходный код с Github и установить его, либо использовать pip:
Для получения дополнительной информации о процессе установки обратитесь к официальной документации.
Чтобы проверить установку, вы можете попробовать импортировать ее, как показано ниже:
Если при импорте модуля вы не получаете никаких ошибок, значит, он был успешным.
Создание запроса GET
Предположим, мы хотим получить содержимое домашней страницы нашего веб-сайта и распечатать результат в виде HTML-данных. Используя модуль запросов, мы можем сделать это, как показано ниже:
Он напечатает ответ в закодированной форме. Если вы хотите увидеть фактический текстовый результат HTML-страницы, вы можете прочитать свойство .text этого объекта. Точно так же свойство status_code выводит текущий код состояния URL-адреса:
Запросы расшифруют необработанный контент и покажут вам результат. Если вы хотите проверить, какой тип кодировки используется запросами, вы можете распечатать это значение, вызвав .encoding. Даже тип кодировки можно изменить, изменив его значение. Не все ли так просто?
Чтение ответа
Содержание «Заголовков ответа» является нашим обязательным элементом. Вы можете увидеть пары ключ-значение, содержащие различную информацию о ресурсе и запросе. Попробуем разобрать эти значения с помощью библиотеки запросов:
Мы получили информацию заголовка с помощью r.headers, и мы можем получить доступ к каждому значению заголовка с помощью определенных ключей. Обратите внимание, что ключ не чувствителен к регистру.
Приведенный выше код напечатает следующий вывод:
Подобно JSON и текстовому контенту, мы можем использовать запросы для чтения контента ответа в байтах для нетекстовых запросов, используя свойство .content. Это автоматически декодирует gzip и дефлирует закодированные файлы.
Передача параметров в GET
В некоторых случаях вам нужно будет передавать параметры вместе с вашими запросами GET, которые принимают форму строк запроса. Для этого нам нужно передать эти значения в параметре params, как показано ниже:
Здесь мы присваиваем значения наших параметров переменной полезной нагрузки, а затем – запросу GET через params. Приведенный выше код вернет следующий результат:
Как видите, библиотека Reqeusts автоматически превратила наш словарь параметров в строку запроса и прикрепила ее к URL-адресу.
Обратите внимание, что вам нужно быть осторожным, какие данные вы передаете через запросы GET, поскольку полезная нагрузка видна в URL-адресе, как вы можете видеть в выходных данных выше.
Выполнение запросов POST
Вместо использования метода get() нам нужно использовать метод post(). Для передачи аргумента мы можем передать его внутри параметра данных:
Отправка файлов
Кортежи, содержащие информацию о файлах, имеют форму (field_name, file_information).
Обработка перенаправлений
Если вы не хотите, чтобы библиотека запросов автоматически выполняла перенаправления, вы можете отключить ее, передав параметр allow_redirects = False вместе с запросом.
Обработка таймаутов
Другая важная конфигурация сообщает нашей библиотеке, как обрабатывать тайм-ауты или запросы, на возврат которых уходит слишком много времени. Мы можем настроить запросы, чтобы они перестали ждать сетевых запросов, используя параметр тайм-аута.
По умолчанию время ожидания запросов не истекает. Итак, если мы не настроим это свойство, наша программа может зависнуть на неопределенное время, что не является той функциональностью, которую вы хотели бы иметь в процессе, заставляющем пользователя ждать.
Здесь будет выброшено исключение, если сервер не ответит в течение 1 секунды (что по-прежнему агрессивно для реального приложения). Чтобы это происходило чаще (для примера), вам нужно установить предел тайм-аута на гораздо меньшее значение, например 0,001.
Тайм-аут может быть настроен как для операций «подключения», так и для «чтения» запроса с использованием кортежа, что позволяет указать оба значения отдельно:
Здесь таймаут «подключения» составляет 5 секунд, а таймаут «чтения» – 14 секунд. Это позволит вашему запросу завершиться ошибкой намного быстрее, если он не может подключиться к ресурсу, а если он все же подключится, это даст ему больше времени для загрузки данных.
Файлы cookie и пользовательские заголовки
Ранее мы видели, как получить доступ к заголовкам с помощью свойства headers. Точно так же мы можем получить доступ к файлам cookie из ответа, используя свойство cookie.
Например, в приведенном ниже примере показано, как получить доступ к cookie с именем cookie_name:
Мы также можем отправлять пользовательские файлы cookie на сервер, предоставляя словарь для параметра cookie в нашем запросе GET.
Файлы cookie также могут передаваться в объекте Cookie Jar. Это позволяет вам предоставлять файлы cookie для другого пути.
Точно так же мы можем создавать собственные заголовки, назначая словарь заголовку запроса с помощью параметра заголовков.
Объект сеанса
Точно так же мы можем использовать объект сеанса для сохранения определенных параметров для всех запросов.
Использование прокси
Аргумент proxies используется для настройки прокси-сервера для использования в ваших запросах.
Библиотека запросов также поддерживает прокси SOCKS. Это дополнительная функция, и она требует, чтобы перед использованием была установлена зависимость requests [socks]. Как и раньше, вы можете установить его с помощью pip:
После установки вы можете использовать его:
Обработка SSL
Это вызовет ошибку, если есть какие-либо проблемы с SSL сайта. Если вы не хотите истинности, просто передайте False вместо True. По умолчанию для этого параметра установлено значение True.
Скачивание файла
Для загрузки файла с помощью запросов мы можем либо загрузить его путем потоковой передачи содержимого, либо напрямую загрузить его целиком. Флаг потока используется для обозначения обоих вариантов поведения.
Как вы, наверное, догадались, если stream имеет значение True, запросы будут передавать контент в потоковом режиме. Если stream имеет значение False, весь контент будет загружен в память, прежде чем он будет возвращен вам.
Для потокового контента мы можем перебирать фрагмент контента фрагментом с помощью метода iter_content или перебирать построчно с помощью iter_line. В любом случае он будет загружать файл по частям.
Приведенный выше код загрузит изображение с сервера Pixabay и сохранит его в локальном файле sun-hat.jpg.
Мы также можем читать необработанные данные, используя свойство raw и stream = True в запросе.
Для загрузки или потоковой передачи контента рекомендуется использовать iter_content().
Ошибки и исключения
Запросы вызывают различные типы исключений и ошибок, если когда-либо возникает проблема с сетью. Все исключения наследуются от класса requests.exceptions.RequestException.
Более полный список и описание исключений, с которыми вы можете столкнуться, можно найти в документации.
Заключение
В этом руководстве я объяснил вам многие функции библиотеки запросов и различные способы ее использования. Вы можете использовать библиотеку запросов не только для взаимодействия с REST API, но и в равной степени использовать ее для сбора данных с веб-сайта или для загрузки файлов из Интернета.
Введение в тему
Этот модуль избавляет Вас от необходимости работать с низкоуровневыми деталями. Работа с запросами становится простой и элегантной.
В этом уроке будут рассмотрены самые полезные функций библиотеки requests и различные способы их использования.
Перед использованием модуля его необходимо установить:
Создание get и post запроса
Сперва необходимо добавить модуль Requests в Ваш код:
Создадим запрос и получим ответ, содержащий страницу и все необходимые данные о ней.
В переменную response попадает ответ на запрос. Благодаря этому объекту можно использовать любую информацию, относящуюся к этому ответу.
Сделать POST запрос так же очень просто:
Передача параметров в url
Здесь мы видим, что URL был сформирован именно так, как это было задумано.
Пара ключ=значение, где значение равняется None, не будет добавлена к параметрам запроса URL.
Так же есть возможность передавать в запрос список параметров:
Содержимое ответа response
Код из предыдущего листинга создаёт объект Response, содержащий ответ сервера на наш запрос. Обратившись к его атрибуту .url можно просмотреть адрес, куда был направлен запрос. Атрибут .text позволяет просмотреть содержимое ответа. Вот как это работает:
Библиотека автоматически пытается определить кодировку ответа основываясь на его заголовках. Узнать, какую кодировку выбрал модуль, можно следующим образом:
Можно так же самостоятельно установить кодировку используя атрибут .encoding.
Бинарное содержимое ответа
Существует возможность просмотра ответа в виде байтов:
При передаче со сжатием ответ автоматически декодируется для Вас.
Содержимое ответа в json
import requests
import json
Если ответ не является JSON, то .json выбросит исключение:
Необработанное содержимое ответа
Если Вам нужно получить доступ к ответу сервера в чистом виде на уровне сокета, обратитесь к атрибуту .raw. Для этого необходимо указать параметр stream=True в запросе. Этот параметр заставляет модуль читать данные по мере их прибытия.
response.iter_content будет автоматически декодировать сжатый ответ. Response.raw — чистый набор байтов, неизменённое содержимое ответа.
Пользовательские заголовки
Более сложные post запросы
Параметр data может иметь произвольное количество значений для каждого ключа. Для этого необходимо указать data в формате кортежа, либо в виде dict со списками значений.
Post отправка multipart encoded файла
Запросы упрощают загрузку файлов с многостраничным кодированием (Multipart-Encoded):
Вы можете установить имя файла, content_type и заголовки в явном виде:
Коды состояния ответа
Возможно, наиболее важные данные (первые – уж точно), которые вы можете получить, используя библиотеку requests, является код состояния ответа.
Так, 200 статус означает, что запрос выполнен успешно, тогда как 404 статус означает, что ресурс не найден.
Важнее всего то, с какой цифры начинается код состояния:
- 1XX — информация
- 2XX — успешно
- 3XX — перенаправление
- 4XX — ошибка клиента (ошибка на нашей стороне)
- 5XX — ошибка сервера (самые страшные коды для разработчика)
Используя атрибут .status_code можно получить статус, который вернул сервер:
.status_code вернул 200 — это означает, что запрос успешно выполнен и сервер вернул запрашиваемые данные.
При желании, такую информацию можно применить в Вашем Пайтон скрипте для принятия решений:
Если применить модуль Response в условном выражении и проверить логическое значение его экземпляра (if response) то он продемонстрирует значение True, если код ответа находится в диапазоне между 200 и 400, и False во всех остальных случаях.
Упростим код из предыдущего примера:
Данный способ не проверяет, что код состояния равен именно 200.
Причиной этого является то, что response с кодом в диапазоне от 200 до 400, такие как 204 и 304, тоже являются успешными, ведь они возвращают обрабатываемый ответ. Следовательно, этот подход делит все запросы на успешные и неуспешные – не более того. Во многих случаях Вам потребуется более детальная обработка кодов состояния запроса.
Содержание статьи
В данной статье представлены наиболее полезные особенности requests. Показано, как изменить и приспособить requests к различным ситуациям, с которыми программисты сталкиваются чаще всего. Здесь также даются советы по эффективному использованию requests и предотвращению влияния сторонних служб, которые могут сильно замедлить работу используемого приложения. Мы использовали библиотек requests в уроке по парсингу html через библиотеку BeautifulSoup.
Ключевые аспекты инструкции:
Далее будут показаны наиболее эффективные методы использования requests в разрабатываемом приложении.
Python установка библиотеки requests
Для начала работы потребуется установить библиотеку requests . Для этого используется следующая команда.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Тем, кто для работы с пакетами Python, использует виртуальную среду Pipenv, необходимо использовать немного другую команду.
Сразу после установки requests можно полноценно использовать в приложении. Импорт requests производится следующим образом.
Таким образом, все подготовительные этапы для последующего использования requests завершены. Начинать изучение requests лучше всего с того, как сделать запрос GET .
Python библиотека Requests метод GET
Для проверки работы команды будет выполнен запрос GET в отношении Root REST API на GitHub. Для указанного ниже URL вызывается метод get() .
Если никакие python ошибки не возникло, вас можно поздравить – первый запрос успешно выполнен. Далее будет рассмотрен ответ на данный запрос, который можно получить при помощи объекта Response.
Объект Response получение ответа на запрос в Python
Response представляет собой довольно мощный объект для анализа результатов запроса. В качестве примера будет использован предыдущий запрос, только на этот раз результат будет представлен в виде переменной. Таким образом, получится лучше изучить его атрибуты и особенности использования.
В данном примере при помощи get() захватывается определенное значение, что является частью объекта Response , и помещается в переменную под названием response . Теперь можно использовать переменную response для того, чтобы изучить данные, которые были получены в результате запроса GET .
Самыми первыми данными, которые будут получены через Response , будут коды состояния. Коды состояния сообщают о статусе запроса.
Например, статус 200 OK значит, что запрос успешно выполнен. А вот статус 404 NOT FOUND говорит о том, что запрашиваемый ресурс не был найден. Существует множество других статусных кодов, которые могут сообщить важную информацию, связанную с запросом.
Используя .status_code , можно увидеть код состояния, который возвращается с сервера.
.status_code вернул значение 200 . Это значит, что запрос был выполнен успешно, а сервер ответил, отобразив запрашиваемую информацию.
В некоторых случаях необходимо использовать полученную информацию для написания программного кода.
В таком случае, если с сервера будет получен код состояния 200 , тогда программа выведет значение Success! . Однако, если от сервера поступит код 404 , тогда программа выведет значение Not Found .
requests может значительно упростить весь процесс. Если использовать Response в условных конструкциях, то при получении кода состояния в промежутке от 200 до 400 , будет выведено значение True . В противном случае отобразится значение False .
Последний пример можно упростить при помощи использования оператора if .
Стоит иметь в виду, что данный способ не проверяет, имеет ли статусный код точное значение 200 . Причина заключается в том, что другие коды в промежутке от 200 до 400 , например, 204 NO CONTENT и 304 NOT MODIFIED , также считаются успешными в случае, если они могут предоставить действительный ответ.
К примеру, код состояния 204 говорит о том, что ответ успешно получен, однако в полученном объекте нет содержимого. Можно сказать, что для оптимально эффективного использования способа необходимо убедиться, что начальный запрос был успешно выполнен. Требуется изучить код состояния и в случае необходимости произвести необходимые поправки, которые будут зависеть от значения полученного кода.
Допустим, если при использовании оператора if вы не хотите проверять код состояния, можно расширить диапазон исключений для неудачных результатов запроса. Это можно сделать при помощи использования .raise_for_status() .
На заметку. Для более продуктивной работы в Python 3.6 будет не лишним изучить f-строки. Не стоит пренебрегать ими, так как это отличный способ упростить форматирование строк.
Анализ способов использования кодов состояния, полученных с сервера, является неплохим стартом для изучения requests. Тем не менее, при создании запроса GET, значение кода состояния является не самой важной информацией, которую хочет получить программист. Обычно запрос производится для извлечения более содержательной информации. В дальнейшем будет показано, как добраться до актуальных данных, которые сервер высылает отправителю в ответ на запрос.
Получить содержимое страницы в Requests
Для того, чтобы получить содержимое запроса в байтах, необходимо использовать .content .
Использование .content обеспечивает доступ к чистым байтам ответного пейлоада, то есть к любым данным в теле запроса. Однако, зачастую требуется конвертировать полученную информацию в строку в кодировке UTF-8. response делает это при помощи .text .
Если присмотреться к ответу, можно заметить, что его содержимое является сериализированным JSON контентом. Воспользовавшись словарем, можно взять полученные из .text строки str и провести с ними обратную сериализацию при помощи использования json.loads(). Есть и более простой способ, который требует применения .json() .
Тип полученного значения из .json() , является словарем. Это значит, что доступ к его содержимому можно получить по ключу.
При использовании ключей 'content-type' и 'Content-Type' результат будет получен один и тот же.
Это была основная информация, требуемая для работы с Response . Были задействованы главные атрибуты и методы, а также представлены примеры их использования. В дальнейшем будет показано, как изменится ответ после настройки запроса GET .
Python Requests параметры запроса
Наиболее простым способом настроить запрос GET является передача значений через параметры строки запроса в URL. При использовании метода get() , данные передаются в params . Например, для того, чтобы посмотреть на библиотеку requests можно использовать Search API на GitHub.
Передавая словарь в параметр params , который является частью .get() , можно изменить ответ, что был получен при использовании Search API .
Можно передать параметры в get() в форме словаря, как было показано выше. Также можно использовать список кортежей.
Также можно передать значение в байтах.
Заголовок Accept сообщает серверу о типах контента, который можно использовать в рассматриваемом приложении. Здесь подразумевается, что все совпадения будут подсвечены, для чего в заголовке используется значение application/vnd.github.v3.text-match+json . Это уникальный заголовок Accept для GitHub. В данном случае содержимое представлено в специальном JSON формате.
Помимо GET , большой популярностью пользуются такие методы, как POST , PUT , DELETE , HEAD , PATCH и OPTIONS . Для каждого из этих методов существует своя сигнатура, которая очень похожа на метод get() .
При использовании каждого из данных методов в Response могут быть возвращены заголовки, тело запроса, коды состояния и многие другие аспекты. Методы POST , PUT и PATCH в дальнейшем будут описаны более подробно.
В свою очередь data использует словарь, список кортежей, байтов или объект файла. Это особенно важно, так как может возникнуть необходимость адаптации отправляемых с запросом данных в соответствии с определенными параметрами сервера.
В том случае, если требуется отравить данные JSON, можно использовать параметр json . При передачи данных JSON через json , requests произведет сериализацию данных и добавит правильный Content-Type заголовок.
Python Requests анализ запроса
При составлении запроса стоит иметь в виду, что перед его фактической отправкой на целевой сервер библиотека requests выполняет определенную подготовку. Подготовка запроса включает в себя такие вещи, как проверка заголовков и сериализация содержимого JSON.
Если открыть .request , можно просмотреть PreparedRequest .
Проверка PreparedRequest открывает доступ ко всей информации о выполняемом запросе. Это может быть пейлоад, URL, заголовки, аутентификация и многое другое.
У всех описанных ранее типов запросов была одна общая черта – они представляли собой неаутентифицированные запросы к публичным API. Однако, подобающее большинство служб, с которыми может столкнуться пользователь, запрашивают аутентификацию.
Аутентификация помогает сервису понять, кто вы. Как правило, вы предоставляете свои учетные данные на сервер, передавая данные через заголовок Authorization или пользовательский заголовок, определенной службы. Все функции запроса, которые вы видели до этого момента, предоставляют параметр с именем auth , который позволяет вам передавать свои учетные данные.
Запрос выполнен успешно, если учетные данные, которые вы передали в кортеже auth , действительны. Если вы попытаетесь сделать этот запрос без учетных данных, вы увидите, что код состояния 401 Unauthorized .
Вы даже можете предоставить свой собственный механизм аутентификации. Для этого необходимо сначала создать подкласс AuthBase. Затем происходит имплементация __call__() .
Здесь пользовательский механизм TokenAuth получает специальный токен. Затем этот токен включается заголовок X-TokenAuth запроса.
Плохие механизмы аутентификации могут привести к уязвимостям безопасности, поэтому, если службе по какой-то причине не нужен настраиваемый механизм аутентификации, вы всегда можете использовать проверенную схему аутентификации, такую как Basic или OAuth.
Пока вы думаете о безопасности, давайте рассмотрим использование requests в SSL сертификатах.
Python Requests проверка SSL сертификата
Хорошей новостью является то, что requests по умолчанию все делает сам. Однако в некоторых случаях необходимо внести определенные поправки.
Если требуется отключить проверку SSL-сертификата, параметру verify функции запроса можно присвоить значение False .
В случае небезопасного запроса requests предупреждает о возможности потери информации и просит сохранить данные или отказаться от запроса.
Примечание. Для предоставления сертификатов requests использует пакет, который вызывается certifi . Это дает понять requests , каким ответам можно доверять. Поэтому вам следует часто обновлять certifi , чтобы обеспечить максимальную безопасность ваших соединений.
Python Requests производительность приложений
При использовании requests , особенно в среде приложений, важно учитывать влияние на производительность. Такие функции, как контроль таймаута, сеансы и ограничения повторных попыток, могут помочь обеспечить бесперебойную работу приложения.
Таймауты
Когда вы отправляете встроенный запрос во внешнюю службу, вашей системе нужно будет дождаться ответа, прежде чем двигаться дальше. Если ваше приложение слишком долго ожидает ответа, запросы к службе могут быть сохранены, пользовательский интерфейс может пострадать или фоновые задания могут зависнуть.
По умолчанию в requests на ответ время не ограничено, и весь процесс может занять значительный промежуток. По этой причине вы всегда должны указывать время ожидания, чтобы такого не происходило. Чтобы установить время ожидания запроса, используйте параметр timeout . timeout может быть целым числом или числом с плавающей точкой, представляющим количество секунд ожидания ответа до истечения времени ожидания.
В этом руководстве мы рассмотрим, как загружать файлы с помощью библиотеки Python requests . Статья начнется с описания библиотеки и сигнатуры функции post() . Далее мы расскажем, как загрузить один файл с помощью пакета requests . И последнее, но не менее важное: мы загружаем несколько файлов за один запрос.
Загрузка одного файла с помощью библиотеки запросов Python
В этом руководстве рассказывается, как отправлять файлы, нас не волнует, как они создаются. Чтобы продолжить, создайте три файла с именами my_file.txt , my_file_2.txt и my_file_3.txt .
Первое, что нам нужно сделать, это установить нашу библиотеку request в нашу рабочую область. Хотя в этом нет необходимости, рекомендуется устанавливать библиотеки в виртуальной среде:
Активируйте виртуальную среду, чтобы мы больше не влияли на глобальную установку Python:
Теперь давайте установим библиотеку requests с помощью pip :
Создайте новый файл с именем single_uploader.py , в котором будет храниться наш код. В этом файле давайте начнем с импорта библиотеки requests :
Теперь мы готовы загрузить файл! При загрузке файла нам нужно открыть файл и выполнить потоковую передачу содержимого. В конце концов, мы не можем загрузить файл, к которому у нас нет доступа. Сделаем это с помощью функции open() .
Функция open() принимает два параметра: путь к файлу и режим. Путь к файлу может быть абсолютным или относительным путем к тому месту, где выполняется сценарий. Если вы загружаете файл в тот же каталог, вы можете просто использовать имя файла.
Второй аргумент, режим, будет принимать значение «read binary», которое представлено rb . Этот аргумент сообщает компьютеру, что мы хотим открыть файл в режиме чтения, и мы хотим использовать данные файла в двоичном формате:
Примечание: важно читать файл в двоичном режиме. Библиотека requests обычно определяет заголовок Content-Length , который представляет собой значение в байтах. Если файл не читается в байтовом режиме, библиотека может получить неверное значение для Content-Length , что приведет к ошибкам при отправке файла.
Теперь у нас есть все, чтобы сделать запрос. Мы будем использовать метод post() библиотеки requests для загрузки файла. Чтобы это работало, нам нужны два аргумента: URL-адрес сервера и свойство files . Также сохраним ответ в переменной, напишем следующий код:
Свойство files принимает словарь. Ключ - это имя поля формы, которое принимает файл. Значение - это байты открытого файла, который вы хотите загрузить.
Давай попробуем! В терминале выполните свой скрипт с помощью команды python :
Ваш результат будет примерно таким:
В качестве проверки работоспособности вы можете убедиться, что значение form_field_name соответствует тому, что находится в вашем файле.
Загрузка нескольких файлов с помощью Python библиотеки requests
Загрузка нескольких файлов с помощью requests очень похожа на загрузку одного файла, с основным отличием в том, что мы используем списки. Создайте новый файл с именем multi_uploader.py и следующий код внутри:
Теперь создайте переменную словарь под названием test_files с несколькими именами и файлами:
Как и раньше, ключи - это имена полей формы, а значения - файлы в байтах.
Мы также можем создавать переменные наших файлов в виде списка кортежей. Каждый кортеж содержит имя поля формы, принимающего файл, за которым следует содержимое файла в байтах:
Любой вариант работает, поэтому выберите тот, который вам больше нравится!
Выполните этот скрипт с помощью команды:
Вы увидите этот вывод:
Заключение
В этой статье мы узнали, как загружать файлы в Python с помощью библиотеки requests . Если это один файл или несколько файлов, требуется лишь несколько настроек метода post() . Мы также проверили наш ответ, чтобы убедиться, что загрузка прошла успешно.
Читайте также: