Office365-REST-Python-文件更新时客户端 401

Office365-REST-Python-Client 401 on File Update

我终于克服了将文件上传到 SharePoint 的障碍,这使我能够在这里回答我自己的问题:

但是,我的项目的重点是将元数据添加到正在上传的文件中,以便可以对它们进行过滤。为了避免重复,我说的是Sharepoints Document Libraries中的列信息。

理想情况下,我想在一开始上传文件时执行此操作,但我对其余部分的理解 API 是您必须先上传,然后使用 PUT 请求更新其元数据.

link 到 Git Hub for Office365-REST-Python-Client: https://github.com/vgrem/Office365-REST-Python-Client

这个库似乎是答案,但我能找到的最接近文档的是在示例文件夹下。遗憾的是,更新文件元数据的示例不存在。我认为部分原因源于唯一的选择是对列表项使用 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' 但它 returns 是 401。如果您在 link-up 顶部查看我对自己问题的回答,您会看到我已授予此应用程序完全控制权。因此,未经授权的响应和停止让我陷入困境,想知道下一步该怎么做。

毕竟,我的问题是: 如何使用 Office365-REST-Python-Client 将文件上传到 Sharepoint 文档库并将元数据添加到其列信息中?

亲切的问候 富有

Upload endpoint请求

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

很高兴我偶然发现了这个 post 和 Office365-REST-Python-Client。但是,我目前无法尝试更新文件的元数据,我不断收到:

'File' object has no attribute 'listitem_allfields'

非常感谢任何帮助。注意,我还将此模块更新为 v 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

所有变体return:

'File' object has no attribute 'listitem_allfields'

我错过了什么?如何将元数据添加到通过 Python/Office365-REST-Python-Client

上传的新 SPO file/list 项目

更新: 问题是我在寻找上传文件的错误 属性。正确的属性是:

uploaded_file.listItemAllFields

注意正确的大小写。希望我的 question/answer 可以帮助像我一样对 attribute/object 外壳一无所知的其他人。