Загрузка файла запроса на исправление

#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)