Office365 REST Python客户端401关于文件更新

Office365 REST Python客户端401关于文件更新,python,rest,sharepoint,sharepointdocumentlibrary,Python,Rest,Sharepoint,Sharepointdocumentlibrary,我终于克服了将文件上传到SharePoint的障碍,这使我能够在这里回答我自己的问题: 然而,我的项目的全部目的是将元数据添加到上传的文件中,以便能够对它们进行过滤。为了避免重复,我讨论的是Sharepoints文档库中的列信息 理想情况下,当我首先上载文件时,我希望这样做,但我对RESTAPI的理解是,必须先上载,然后使用PUT请求更新其元数据 指向Office365 REST Python客户端Git Hub的链接: 这个图书馆似乎是答案,但我能找到的最接近文档的地方是在examples

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

然而,我的项目的全部目的是将元数据添加到上传的文件中,以便能够对它们进行过滤。为了避免重复,我讨论的是Sharepoints文档库中的列信息

理想情况下,当我首先上载文件时,我希望这样做,但我对RESTAPI的理解是,必须先上载,然后使用PUT请求更新其元数据

指向Office365 REST Python客户端Git Hub的链接:

这个图书馆似乎是答案,但我能找到的最接近文档的地方是在examples文件夹下。遗憾的是,更新文件元数据的示例并不存在。我认为这样做的部分原因是因为唯一的选择是对列表项使用PUT请求

根据此库所基于的RESTAPI文档,项的元数据必须作为列表的一部分进行操作

用于文件上载的REST API文档:

用于更新列表元数据的REST API文档:

有一个更新列表项的示例: “”但它返回一个401。如果你看我在链接顶部对我自己问题的回答,你会发现我授予了这个应用程序完全控制权。因此,一个未经授权的响应和停止让我陷入困境,不知道下一步该怎么办

所以在所有这些之后,我的问题是: 如何使用Office365 REST Python客户端将文件上载到Sharepoint文档库并向其列信息添加元数据

问候 富请求

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客户端。但是,我目前无法更新文件的元数据,我一直收到:

'File' object has no attribute 'listitem_allfields'
非常感谢您的帮助。注意,我还将此模块更新为v2.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'
我错过了什么?如何向通过Python/Office365 REST Python客户端上载的新SPO文件/列表项添加元数据

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

uploaded_file.listItemAllFields

注意正确的外壳。希望我的问题/答案可以帮助像我一样对属性/对象大小写一无所知的其他人。

有类似的问题,您可能会发现我在Github上通过Vgrem的帮助提出/解决的问题很有趣: