Теперь проблема в том, что мне нужно сделать это для multipart/form -data, и он, похоже, не поддерживает генератор.
- Я попробовал files={'content': my_generator_func()} и получил: " требуется байтовый объект, а не «генератор»; так что похоже, что он принял бы дескриптор файла, но не генератор.
- Затем я попробовал генератор для аргумента данных и установите для аргумента files имя и значение формы: files={'encoding': (None, 'base64')} [Я читал, что вам нужно использовать аргумент files для получения запросов на выполнение multipart/form-data] Для этого я получаю ошибку "Потоковые тела и файлы взаимно эксклюзивный".
- На всякий случай я попробовал разные способы установки заголовка для Content-Type multipart/form-data, как с помощью, так и с помощью без него [я читал, что установка его самостоятельно может испортить запросы.] Если я его пропустил, он пожаловался, что он отсутствует; и если я включил его, я получил указанные ранее ошибки.
- Помощник MultipartEncoder, хотя и принимает дескриптор файла, не принимает генератор.
PS. Ближайший пост StackOverflow по этой теме: Как отправить " multipart/form-data" с запросами на Python?
PPS Я тоже пробовал это:
https://toolbelt.readthedocs.io/en/late ... -generator
и конечная точка не видя отправляемые данные формы. [Я подтвердил, что это работает с Curl, используя аргументы --form name=value.]
Меня попросили привести пример кода:
Код: Выделить всё
def my_generator():
'when iterated over, this will return "value_fragment1;value_fragment2;"'
yield 'value_fragment1;'
yield 'value_fragment2;'
response=requests.post(url,
# tried with+without this header...
headers={'Content-Type': 'multipart/form-data'},
data={'field1': (None, 'value1'),
'field2': (None, 'value2')
}, # the data argument is done the way the Stack post suggests for multipart...
files={'field3', my_generator()}
)
# this code generates the generator not expected error...
Код: Выделить всё
from requests_toolbelt.streaming_iterator import StreamingIterator
# .
# .
# .
# this is done just to get a length
# for the content in this example;
# in a real implementation we would calculate this...
content=''
for fragment in my_generator():
content+=fragment
streamer=StreamingIterator(len(content), my_generator())
response=requests.post(url,
# tried with+without this header...
headers={'Content-Type': 'multipart/form-data'},
data={'field1': (None, 'value1'),
'field2': (None, 'value2')
}, # the data argument is done the way the Stack post suggests for multipart...
files={'field3', streamer}
)
# the endpoint does not see the fields,
# while it sees them for a curl --form field1=value1 --form field2=value2 ...
Попробовал это и подключил к MultipartEncoder:
Как прочитать tar-файл из генератора?
Это не так просто как думает этот пост; вам необходимо реализовать функции поиска в вашем классе BufferedReader/RawIOBase:
Код: Выделить всё
File "/usr/lib/python3/dist-packages/requests_toolbelt/multipart/encoder.py", line 573, in len
return total_len(self.fd) - self.fd.tell()
^^^^^^^^^^^^^^
io.UnsupportedOperation: seek
Похоже, что реализация генератора multipart/form-data была недосмотром разработчиков запросов [toolbelt]...
Подробнее здесь: https://stackoverflow.com/questions/791 ... -generator
Мобильная версия