如何使用服务账户结合Django访问指定SharePoint文件夹?
一、准备依赖
使用office365-rest-python-client库实现SharePoint的服务账户认证与操作,先安装依赖:
pip install office365-rest-python-client
二、配置服务账户权限
- 在Azure AD中注册应用程序,获取租户ID、客户端ID、客户端密钥。
- 为该应用分配SharePoint相关权限(如
Sites.Read.All或针对目标站点的只读/读写权限),并由租户管理员完成权限同意。 - 确认目标SharePoint站点(修正后的URL应为
https://team.yourcompany.com/sites/Documentation)已允许该应用访问。
三、Django中实现访问逻辑
1. 在settings.py中配置参数
# settings.py SHAREPOINT_TENANT_ID = "你的租户ID" SHAREPOINT_CLIENT_ID = "你的应用客户端ID" SHAREPOINT_CLIENT_SECRET = "你的应用客户端密钥" SHAREPOINT_SITE_URL = "https://team.yourcompany.com/sites/Documentation" # 服务器相对路径,根据实际文件夹位置调整,比如文档库下的目标文件夹 SHAREPOINT_FOLDER_RELATIVE_PATH = "Documents/目标文件夹"
2. 编写SharePoint工具函数
创建utils/sharepoint_utils.py:
from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.client_credential import ClientCredential from django.conf import settings def fetch_sharepoint_folder_content(): # 初始化客户端上下文并完成服务账户认证 ctx = ClientContext(settings.SHAREPOINT_SITE_URL).with_credentials( ClientCredential(settings.SHAREPOINT_CLIENT_ID, settings.SHAREPOINT_CLIENT_SECRET) ) # 获取目标文件夹对象 target_folder = ctx.web.get_folder_by_server_relative_url(settings.SHAREPOINT_FOLDER_RELATIVE_PATH) # 拉取文件夹下的所有文件 files = target_folder.files.get().execute_query() # 整理返回数据 content_list = [] for file in files: content_list.append({ "文件名": file.name, "相对路径": file.serverRelativeUrl, "文件大小": file.length, "创建时间": file.timeCreated.isoformat() }) return content_list
3. 在视图中调用工具函数
# views.py from django.http import JsonResponse from .utils.sharepoint_utils import fetch_sharepoint_folder_content def sharepoint_folder_access(request): try: folder_content = fetch_sharepoint_folder_content() return JsonResponse({"成功": True, "文件夹内容": folder_content}) except Exception as e: return JsonResponse({"成功": False, "错误信息": str(e)}, status=500)
四、关键注意事项
- 修正原URL:原URL中的
team..com和//属于格式错误,需替换为实际有效的站点域名与路径。 - 路径校验:
get_folder_by_server_relative_url接收的是相对于SharePoint站点的服务器路径,需确认目标文件夹的实际相对路径(可通过SharePoint站点的文件夹属性查看)。 - 权限排查:若仍无法访问,检查Azure AD应用的权限是否已生效,以及服务账户是否被允许访问目标站点/文件夹。
内容的提问来源于stack exchange,提问作者Nikhil Prabhakar
相关产品推荐
相关产品推荐

