2016-03-03 3 views
6

Я искал способы загрузки большого файла с дополнительными данными, но, похоже, не существует никакого решения. Чтобы загрузить файл, я использую этот код и он работает отлично с небольшим файлом:Запросы python Загрузка большого файла с дополнительными данными

with open("my_file.csv", "rb") as f: 
    files = {"documents": ("my_file.csv", f, "application/octet-stream")} 
    data = {"composite": "NONE"} 
    headers = {"Prefer": "respond-async"} 
    resp = session.post("my/url", headers=headers, data=data, files=files) 

Проблема заключается в том, что код загружает весь файл перед отправкой, и я хотел бы работать в MemoryError при загрузке большого файлы. Я посмотрел вокруг, и путь к потоку данных, чтобы установить

resp = session.post("my/url", headers=headers, data=f) 

, но мне нужно, чтобы добавить { «композит»: «NONE»} к данным. Если нет, сервер не распознает файл.

+0

Рассматривая код в models.py, класс PreparedRequest, метод prepare_body, нет возможности использовать запросы для потоковой загрузки большого файла с дополнительными данными. –

ответ

5

Вы можете использовать requests-toolbelt сделать это:

import requests 
from requests_toolbelt.multipart import encoder 

session = requests.Session() 
with open('my_file.csv', 'rb') as f: 
    form = encoder.MultipartEncoder({ 
     "documents": ("my_file.csv", f, "application/octet-stream"), 
     "composite": "NONE", 
    }) 
    headers = {"Prefer": "respond-async", "Content-Type": form.content_type} 
    resp = session.post(url, headers=headers, data=form) 

Это вызовет запросы потоковую загрузку multipart/form-data для вас.

+0

Большое спасибо! Я помню, что раньше встречался с запросами-инструментами, но не думал о том, чтобы добавить Content-Type в заголовок! –

+0

Да, документация для инструментальной панели довольно явно говорит, что вам это нужно. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^