Отправка "multipart/form-data" через "requests" в Python
Быстрый ответ
Для отправки данных формата multipart/form-data
с помощью библиотеки requests в Python, используйте метод requests.post()
, передавая файлы через параметр files
. Вот пример такого кода:
import requests
url = 'ВАШ_URL'
files = {'file': open('file.txt', 'rb')}
response = requests.post(url, files=files)
print(response.text)
Этот код отправляет файл 'file.txt' на сервер по указанному URL. Переменные url
и files
должны быть заменены в соответствии со вашими потребностями.
Отправка форм без файлов
Если нужно отправить только данные формы без прикрепленных файлов, воспользуйтесь кортежом (None, data)
в значении словаря files
:
fields = {
('field1', (None, 'value1')),
('field2', (None, 'value2'))
}
response = requests.post(url, files=fields)
Такой подход обеспечивает корректную передачу значений полей формы без добавления файлов.
Управление именем файла и типом содержимого в HTTP-заголовках
Для более точного указания имени файла и типа контента в HTTP-заголовках вы можете применить кортежи внутри словаря files
:
files = {
'file': ('report.csv', open('report.csv', 'rb'), 'text/csv')
}
response = requests.post(url, files=files)
Приведенный выше пример отправит файл 'report.csv' с указанием типа содержимого text/csv.
Сложная кодировка multipart для экспертов
Для расширенной отправки данных с использованием потоков и настройки HTTP-заголовков может быть полезным использование библиотеки requests_toolbelt
:
from requests_toolbelt import MultipartEncoder
multipart_data = MultipartEncoder(
fields={
'field1': 'value1',
'file': ('passwords.txt', open('passwords.txt', 'rb'), 'text/plain')
}
)
response = requests.post(url, data=multipart_data, headers={'Content-Type': multipart_data.content_type})
Использование requests_toolbelt
позволяет более гибко обрабатывать специфические случаи работы с multipart данными.
Визуализация
Отправка multipart/form-data
в Python напоминает собирание чемодана для международного полёта:
В чемодане (отправляемом запросе) могут находиться:
- Одежда (текстовые поля формы)
- Бутылки (файлы)
Используйте requests.post()
для отправки "упакованного чемодана":
requests.post('URL', files=packed_suitcase)
Аналогия с аэропортом:
Чемодан (отправляемый запрос) -> Лейбл (URL назначения)
Одежда (Текстовые поля формы) + Бутылки (Файлы) -> Общий вид содержимого (multipart/form-data)
Сравнивая эндпойнт URL с местом назначения, мы можем представить данные в виде вещей, которые нужно положить в чемодан.
Проверка SSL
Обход ошибок SSL с помощью verify=False
– это плохая практика. Лучше решить проблемы с SSL-сертификатами, а не игнорировать их.
Управление загрузкой больших файлов – Время для потоковой передачи
При загрузке больших файлов важно использовать потоковую передачу данных, чтобы избежать перегрузки памяти:
with open('huge_file.iso', 'rb') as f:
requests.post(url, data=f)
Такой подход позволяет не загружать весь файл в память сразу.
Интеграция с FastAPI для загрузки файлов
Во время работы с FastAPI, загрузку файлов можно реализовать следующим образом:
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
return {"filename": file.filename}
Этот пример кода демонстрирует, как принимать загруженные файлы на сервере с использованием FastAPI.
Именование и форматирование данных – Внимание к деталям
Правильная подготовка запроса и корректное именование полей и файлов играют важную роль: они должны соответствовать ожиданиям сервера для адекватной обработки multipart данных.
Полезные материалы
- Продвинутое использование — документация к библиотеке Requests 2.31.0 — Руководство по использованию multipart/form-data с использованием Requests.
- Content-Type – HTTP | MDN — Здесь объясняется смысл заголовка Content-Type и его применение.
- Обсуждение на Stack Overflow — Обсуждение, содержащее полезные примеры.
- Мега-Учебник по Flask, Часть I: Hello, World! — Статья о загрузке файлов в Flask.
- Загрузка данных — документация к requests_toolbelt 1.0.0 — Как использовать encoder для потоковой передачи multipart данных.
- Загрузка файлов — документация Flask (версия 1.1.x) — Инструкция по работе с загрузкой файлов в Flask.