Office365-REST-Python-Client 401 при обновлении файла

Наконец-то я преодолел трудности с загрузкой файлов в SharePoint, что позволило мне ответить на свой вопрос здесь: Проблема с токеном доступа Office365-REST-Python-Client

Однако весь смысл моего проекта заключался в добавлении метаданных к загружаемым файлам, чтобы можно было фильтровать их. Чтобы избежать дублирования, я говорю о столбцах в библиотеках документов Sharepoints.

В идеале я хотел бы сделать это, когда загружаю файлы в первую очередь, но мое понимание остального API заключается в том, что вы должны сначала загрузить, а затем использовать запрос PUT для обновления его метаданных.

Ссылка на Git Hub для Office365-REST-Python-Client: https://github.com/vgrem/Office365-REST-Python-клиент

Эта библиотека кажется ответом, но самая близкая к документации, которую я могу найти, находится в папке примеров. К сожалению, пример для метаданных файла обновления не существует. Я думаю, что отчасти причина этого связана с единственным вариантом — использовать запрос PUT для элемента списка.

Согласно документации REST API, на которой построена эта библиотека, метаданные элемента должны обрабатываться как часть списка.

Документация REST API для загрузки файлов: https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/working-with-folders-and-files-with-rest#working-with-files-by-using-rest

Документация REST API для обновления метаданных списка: https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest#update-list-item

Вот пример обновления элемента списка: «https://github.com/vgrem/Office365-REST-Python-Client/blob/master/examples/sharepoint/listitems_operations_alt.py», но он возвращает 401. Если вы посмотрите на мой ответ на мой собственный вопрос в верхней части ссылки, вы увидите, что я предоставил этому приложению полный доступ. Таким образом, несанкционированный ответ и остановка остановили меня как вкопанный, задаваясь вопросом, что делать дальше.

Итак, после всего этого мой вопрос: Как загрузить файл в библиотеку документов Sharepoint и добавить метаданные в информацию его столбца с помощью Office365-REST-Python-Client?

С уважением Богатый

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
3 261
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Upload конечная точка запрос

url: http://site url/_api/web/GetFolderByServerRelativeUrl('/Shared Documents')/Files/Add(url='file name', overwrite=true)
method: POST
body: contents of binary file
headers:
    Authorization: "Bearer " + accessToken
    X-RequestDigest: form digest value
    content-type: "application/json;odata=verbose"
    content-length:length of post body

может быть преобразован в следующий пример Python:

ctx = ClientContext(url, ctx_auth)

file_info = FileCreationInformation()
file_info.content = file_content
file_info.url = os.path.basename(path)
file_info.overwrite = True
target_file = ctx.web.get_folder_by_server_relative_url("Shared Documents").files.add(file_info)
ctx.execute_query()

После загрузки файла его метаданные могут быть установлены следующим образом:

list_item = target_file.listitem_allfields # get associated list item 
list_item.set_property("Title", "New title")
list_item.update()
ctx.execute_query()

Я рад, что наткнулся на этот пост и на Office365-REST-Python-Client в целом. Однако в настоящее время я застрял, пытаясь обновить метаданные файла, я продолжаю получать:

'File' object has no attribute 'listitem_allfields'

Любая помощь приветствуется. Обратите внимание, я также обновил этот модуль до версии 2.3.1.

Вот мой код:

list_title = "Documents"
target_folder = ctx.web.lists.get_by_title(list_title).root_folder
target_file = target_folder.upload_file(filename, filecontents)    
ctx.execute_query()
list_item = target_file.listitem_allfields

Я также пробовал:

library_root = ctx.web.get_folder_by_server_relative_url('Shared Documents')
file_info = FileCreationInformation()
file_info.overwrite = True
file_info.content = filecontent
file_info.url = filename
upload_file = library_root.files.add(file_info)
ctx.load(upload_file)
ctx.execute_query()
list_item = upload_file.listitem_allfields

Я также пытался получить загруженный элемент файла напрямую с тем же результатом:

target_folder = ctx.web.lists.get_by_title(list_title).root_folder
target_file = target_folder.upload_file(filename, filecontent)    
ctx.execute_query()

uploaded_file = ctx.web.get_file_by_server_relative_url(target_file.serverRelativeUrl)
print(uploaded_file.__dict__)
list_item = uploaded_file.listitem_allfields

Все варианты возвращаются:

'File' object has no attribute 'listitem_allfields'

Что мне не хватает? Как добавить метаданные в новый файл/элемент списка SPO, загруженный через Python/Office365-REST-Python-Client

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

uploaded_file.listItemAllFields

Обратите внимание на правильный корпус. Надеюсь, мой вопрос/ответ может помочь кому-то другому, кто так же невежественен, как и я, в отношении корпуса атрибута/объекта.

была аналогичная проблема, вы можете найти интересной проблему, которую я поднял/решил с помощью Vgrem на Github: github.com/vgrem/Office365-REST-Python-Client/issues/…

Richard Ellison 16.12.2020 17:51

Другие вопросы по теме