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 文档库并将元数据添加到其列信息中?
亲切的问候
富有
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 外壳一无所知的其他人。
我终于克服了将文件上传到 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 文档库并将元数据添加到其列信息中?
亲切的问候 富有
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 外壳一无所知的其他人。