使用Shareplum向SharePoint上传文件出现X-RequestDigest键错误如何解决
错误原因
你获取X-RequestDigest的逻辑完全错误:你发起的第一个POST请求本身是文件上传请求,该请求要求请求头携带合法的X-RequestDigest才能执行成功,但你此时填的是占位字符串FormDigestValue,这个请求必然执行失败,失败响应的头里自然不存在X-RequestDigest字段,触发KeyError。
修复步骤
- 调用SharePoint专门的contextinfo接口获取合法的X-RequestDigest,不要通过上传请求拿
- 修正文档库路径的URL编码问题,
Shared%20Documents要改为原始字符串Shared Documents,否则接口会识别不到路径 - 修正状态码判断逻辑,
response.status_code是整数类型,不要和字符串'200'做比对
修正后的完整代码
import requests from shareplum import Office365 # Set Login Info username = 'my.email@address.com' password = 'myverifiedapppassword' site_name = 'mysite' base_path = 'https://xxxxxxxx.sharepoint.com' site_path = base_path + "/sites/" + site_name doc_library = 'Shared Documents' file_name = "hellotest.txt" # Obtain auth cookie authcookie = Office365(base_path, username=username, password=password).GetCookies() session = requests.Session() session.cookies = authcookie session.headers.update({'user-agent': 'python_bite/v1'}) session.headers.update({'accept': 'application/json;odata=verbose'}) # 正确获取X-RequestDigest的逻辑 digest_resp = session.post(f"{site_path}/_api/contextinfo") digest_value = digest_resp.json()['d']['GetContextWebInformation']['FormDigestValue'] session.headers.update({'X-RequestDigest': digest_value}) # Upload file with open(file_name, 'rb') as file_input: try: response = session.post( url=f"{site_path}/_api/web/GetFolderByServerRelativeUrl('{doc_library}')/Files/add(url='{file_name}',overwrite=true)", data=file_input) print("response: ", response.status_code) if response.status_code == 200: print("File uploaded successfully") except Exception as err: print("Something went wrong: " + str(err))
内容的提问来源于stack exchange,提问作者yekootmada
相关产品推荐
相关产品推荐

