#python #rest #optimization #python-requests #http-patch
#python #остальное #оптимизация #python-запросы #http-исправление
Вопрос:
У меня есть REST API, в который я пытаюсь загрузить данные, и это в основном так: https://learn.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/update
Теперь, поскольку единственный вариант, который у меня есть, — это ИСПРАВЛЕНИЕ, какие у меня есть варианты для оптимизированной загрузки данных. Я смог загружать файлы с помощью параметра data и функции read (), но я не думаю, что это оптимально, поскольку, я полагаю, весь файл считывается в память. Я попытался использовать параметр files (кодировка формы multipaprt), а также просмотрел пакет toolbelt, но, похоже, это не работает для ИСПРАВЛЕНИЯ
Это пример кода, который работает, но не является оптимальным
files={'file':('Sample',open('D:/FilePath/Demo.txt','rb'))}
length=os.stat('D:/FilePath/Demo.txt')
filesize=str(length.st_size)
with open('D:/File|Path/Demo.txt','rb') as f:
file_data = f.read()
leng=len(file_data)
header = {
'Authorization': "Bearer " auth_t
}
header_append = {
'Content-Length': filesize,
'Authorization': "Bearer " auth_t
#'If-None-Match': "*" #Conditional HTTP Header
}
header_flush = {
'Content-Length': '0',
'Authorization': "Bearer " auth_t
}
header_read = {
'Authorization': "Bearer " auth_t
}
try:
init_put=requests.put('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?resource=fileamp;recursive=True', headers=header_flush, proxies=proxies,verify=False)
init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=appendamp;position=0', headers=header_append, proxies=proxies,verify=False,data=file_data)
flush_url='https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=flushamp;position=' str(leng)
init_flush=requests.patch(flush_url, headers=header_flush, proxies=proxies,verify=False)
Проблема в строке
init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=appendamp;position=0', headers=header_append, proxies=proxies,verify=False,data=file_data)
Кажется, что требуется только параметр data. Если я изменю его на
init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=appendamp;position=0', headers=header_append, proxies=proxies,verify=False,file=files)
Я получаю пустой файл.
То же самое происходит, когда я использую пакет requestToolbelt.
Исправление не распознает параметр file? В документах запросов ничего об этом не говорится.
Кроме того, если параметр data является единственным выходом, каков наилучший способ загрузки файла без выполнения f.read() или итеративного указания количества символов для чтения с помощью f.read(n). Разве нет способа получше?
Ответ №1:
Также просмотрев Postman, смог найти проблему. Вот решение. Проблема заключалась в операторе with open и, в частности, в параметре position для части flush, поскольку длина содержимого была переопределена автоматически, поэтому пришлось получать длину содержимого из запроса ответа.
files={'file':('Sample',open('D:/FilePath/Demo.txt','rb'))}
length=os.stat('D:/FilePath/Demo.txt')
filesize=str(length.st_size)
header = {
# 'Content-Type': 'text/plain',
'Authorization': "Bearer " auth_t
#'If-None-Match': "*" #Conditional HTTP Header
}
header_append = {
'Content-Length': filesize,
'Authorization': "Bearer " auth_t
#'If-None-Match': "*" #Conditional HTTP Header
}
header_flush = {
'Content-Type': "application/x-www-form-urlencoded",
'Content-Length': '0',
'Authorization': "Bearer " auth_t,
#'If-None-Match': "*" #Conditional HTTP Header
}
header_read = {
# 'Content-Type': 'text/plain',
'Authorization': "Bearer " auth_t,
#'Range': 'bytes=300000-302591'
#'If-None-Match': "*" #Conditional HTTP Header
}
try:
init_put=requests.put('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?resource=fileamp;recursive=True', headers=header_flush, proxies=proxies,verify=False)
init_write=requests.patch('https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=appendamp;position=0', headers=header_append, proxies=proxies,verify=False,files=files)
flush_length=init_write.request.headers['Content-Length']
flush_url='https://adlstorageacc.dfs.core.windows.net/adobe/2019/02/DemoStreamFile4.txt?action=flushamp;position=' str(flush_length)
init_flush=requests.patch(flush_url, headers=header_flush, proxies=proxies,verify=False)
except Exception as e:
print("In Error")
print(e)