Вступление
Python поддерживается многими библиотеками, которые упрощают передачу
данных по HTTP. Библиотека requests
- один из самых популярных пакетов
Python, поскольку он активно используется при парсинге веб-страниц. Он
также популярен для взаимодействия с серверами! Библиотека упрощает
загрузку данных в популярном формате, таком как JSON, а также упрощает
загрузку файлов.
В этом руководстве мы рассмотрим, как загружать файлы с помощью
библиотеки requests
Статья начнется с рассмотрения библиотеки
requests
и сигнатуры функции post()
Далее мы расскажем, как
загрузить один файл с помощью пакета requests
И последнее, но не менее
важное: мы загружаем несколько файлов за один запрос.
Загрузка одного файла с помощью библиотеки запросов Python
В этом руководстве рассказывается, как отправлять файлы, нас не волнует,
как они создаются. Чтобы продолжить, создайте три файла с
my_file_2.txt
my_file.txt
, my_file_2.txt и my_file_3.txt
.
Первое, что нам нужно сделать, это установить нашу request
в нашу
рабочую область. Хотя в этом нет необходимости, рекомендуется
устанавливать библиотеки в виртуальной среде:
$ python3 -m venv .
Активируйте виртуальную среду, чтобы мы больше не влияли на глобальную установку Python:
$ . bin/activate
Теперь установим requests
с помощью pip
:
$ pip install requests
Создайте новый файл с именем single_uploader.py
котором будет
храниться наш код. В этом файле давайте начнем с импорта библиотеки
requests
import requests
Теперь мы готовы загрузить файл! При загрузке файла нам нужно открыть
файл и выполнить потоковую передачу содержимого. В конце концов, мы не
можем загрузить файл, к которому у нас нет доступа. Сделаем это с
помощью функции open()
.
Функция open()
принимает два параметра: путь к файлу и
режим . Путь к файлу может быть абсолютным
или относительным путем к тому месту, где выполняется сценарий. Если вы
загружаете файл в тот же каталог, вы можете просто использовать имя
файла.
Второй аргумент, режим, будет принимать значение «читать двоичное»,
которое представлено rb
. Этот аргумент сообщает компьютеру, что мы
хотим открыть файл в режиме чтения, и мы хотим использовать данные файла
в двоичном формате:
test_file = open("my_file.txt", "rb")
Примечание : важно читать файл в двоичном режиме. Библиотека
requests
обычно определяет Content-Length
, который представляет
собой значение в байтах. Если файл не читается в байтовом режиме,
библиотека может получить неверное значение Content-Length
, что
приведет к ошибкам при отправке файла.
В этом руководстве мы будем делать запросы к бесплатному сервису httpbin . Этот API позволяет разработчикам тестировать свои HTTP-запросы. Давайте создадим переменную, которая хранит URL-адрес, по которому мы будем размещать наши файлы:
test_url = "http://httpbin.org/post"
Теперь у нас есть все, чтобы сделать запрос. Мы будем использовать метод
post()
requests
для загрузки файла. Чтобы это работало, нам нужны
два аргумента: URL-адрес сервера и свойство files
Также сохраним ответ
в переменной, напишем следующий код:
test_response = requests.post(test_url, files = {"form_field_name": test_file})
Свойство files
принимает словарь. Ключ - это имя поля формы, которое
принимает файл. Значение - это байты открытого файла, который вы хотите
загрузить.
Обычно, чтобы проверить, был ли ваш post()
успешным, мы проверяем код
состояния HTTP ответа. Мы можем использовать ok
объекта ответа
test_url
. Если это правда, мы распечатаем ответ HTTP-сервера, в этом
случае он отобразит запрос:
if test_response.ok:
print("Upload completed successfully!")
print(test_response.text)
else:
print("Something went wrong!")
Давай попробуем! В терминале выполните свой скрипт с помощью команды
python
python single_uploader.py
Ваш результат будет примерно таким:
Upload completed successfully!
{
"args": {},
"data": "",
"files": {
"form_field_name": "This is my file\nI like my file\n"
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "189",
"Content-Type": "multipart/form-data; boundary=53bb41eb09d784cedc62d521121269f8",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.25.0",
"X-Amzn-Trace-Id": "Root=1-5fc3c190-5dea2c7633a02bcf5e654c2b"
},
"json": null,
"origin": "102.5.105.200",
"url": "http://httpbin.org/post"
}
form_field_name
вы можете убедиться, что значение form_field_name
совпадает с тем, что находится в вашем файле.
Загрузка нескольких файлов с помощью библиотеки запросов Python
Загрузка нескольких файлов с помощью запросов очень похожа на загрузку
одного файла, с основным отличием, которое мы используем списки.
Создайте новый файл с именем multi_uploader.py
и следующий
установочный код:
import requests
test_url = "http://httpbin.org/post"
Теперь создайте переменную с именем test_files
которая представляет
собой словарь с несколькими именами и файлами:
test_files = {
"test_file_1": open("my_file.txt", "rb"),
"test_file_2": open("my_file_2.txt", "rb"),
"test_file_3": open("my_file_3.txt", "rb")
}
Как и раньше, ключи - это имена полей формы, а значения - файлы в байтах.
Мы также можем создавать переменные наших файлов в виде списка кортежей. Каждый кортеж содержит имя поля формы, принимающего файл, за которым следует содержимое файла в байтах:
test_files = [("test_file_1", open("my_file.txt", "rb")),
("test_file_2", open("my_file_2.txt", "rb")),
("test_file_3", open("my_file_3.txt", "rb"))]
Любой из них работает, поэтому выберите тот, который вам больше нравится!
Когда список файлов будет готов, вы можете отправить запрос и проверить его ответ, как раньше:
test_response = requests.post(test_url, files = test_files)
if test_response.ok:
print("Upload completed successfully!")
print(test_response.text)
else:
print("Something went wrong!")
Выполните этот скрипт с помощью команды python
$ python multi_uploader.py
Вы увидите этот вывод:
Upload completed successfully!
{
"args": {},
"data": "",
"files": {
"test_file_1": "This is my file\nI like my file\n",
"test_file_2": "All your base are belong to us\n",
"test_file_3": "It's-a me, Mario!\n"
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "470",
"Content-Type": "multipart/form-data; boundary=4111c551fb8c61fd14af07bd5df5bb76",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.25.0",
"X-Amzn-Trace-Id": "Root=1-5fc3c744-30404a8b186cf91c7d239034"
},
"json": null,
"origin": "102.5.105.200",
"url": "http://httpbin.org/post"
}
Отличная работа! Вы можете загружать один и несколько файлов с
requests
!
Заключение
В этой статье мы узнали, как загружать файлы на Python с помощью
библиотеки requests
Если это один файл или несколько файлов,
потребуется всего несколько настроек метода post()
Мы также проверили
наш ответ, чтобы убедиться, что наши загрузки были успешными.