代码之家  ›  专栏  ›  技术社区  ›  Zach

尝试将自己授权到sharepoint网站时接收keyerror

  •  1
  • Zach  · 技术社区  · 6 年前

    我正在尝试使用Python连接到SharePoint在线网站。我在GitHub上找到了Office365 REST Python客户端,并一直以此作为指导。我使用了“pip安装Office365 REST-Python客户端”,它的安装没有任何问题。在examples文件夹中,我将跟随名为“listitems\u operations\u alt.py”的文件。如果我将代码粘贴到python文件中,并且根本不修改它,我会收到一个错误:“NameError:name‘urlparse’is not defined”。如果我试图更改url以匹配SharePoint Online网站的url,我会收到一个错误“KeyError:'mysite.SharePoint.com'”。我不确定是什么导致了这个问题。下面是我的代码。

    from examples.settings import settings
    from office365.runtime.auth.authentication_context import AuthenticationContext
    from office365.runtime.client_request import ClientRequest
    
    
    def read_list_items(web_url, ctx_auth, list_title):
        """Read list items example"""
        request = ClientRequest(web_url, ctx_auth)
        request_url = "{0}/_api/web/lists/getbyTitle('{1}')/items".format(web_url, list_title)  # Web resource endpoint
    
        print("Retrieving list items from List {0}".format(list_title))
        data = request.execute_request_direct(request_url=request_url)
        for item in data['d']['results']:
            print("Item title: {0}".format(item["Title"]))
    
    
    def create_list_item(web_url, ctx_auth, list_title):
        """Create list item example"""
        request = ClientRequest(web_url, ctx_auth)
        request_url = "{0}/_api/web/lists/getbyTitle('{1}')/items".format(web_url, list_title)  # Web resource endpoint
    
        print("Creating list item...")
        item_payload = {'__metadata': {'type': 'SP.Data.TasksListItem'}, 'Title': 'New Task'}
        data = request.execute_request_direct(request_url=request_url, data=item_payload)
        print("Task {0} has been successfully [created]".format(data['d']['Title']))
        return data['d']
    
    
    def update_list_item(web_url, ctx_auth, list_title, item_id):
        """Update list item example"""
        request = ClientRequest(web_url, ctx_auth)
        request_url = "{0}/_api/web/lists/getbyTitle('{1}')/items({2})".format(web_url, list_title, item_id)
        print("Updating list item...")
        item_payload = {'__metadata': {'type': 'SP.Data.TasksListItem'}, 'Title': 'New Task (updated)'}
        headers = {
            'IF-MATCH': '*',
            'X-HTTP-Method': 'MERGE'
        }
        request.execute_request_direct(request_url=request_url, headers=headers, data=item_payload)
        print("Task has been successfully [updated]")
    
    
    def delete_list_item(web_url, ctx_auth, list_title, item_id):
        """Delete list item example"""
        request = ClientRequest(web_url, ctx_auth)
        request_url = "{0}/_api/web/lists/getbyTitle('{1}')/items({2})".format(web_url, list_title, item_id)
        print("Deleting list item...")
        headers = {
            'IF-MATCH': '*',
            'X-HTTP-Method': 'DELETE'
        }
        request.execute_request_direct(request_url=request_url, headers=headers)
        print("Task has been successfully [deleted]")
    
    
    if __name__ == '__main__':
        context_auth = 
    AuthenticationContext(url=settings['mysite.sharepoint.com'])
        if context_auth.acquire_token_for_user(username=settings['username'], 
    password=settings['password']):
    
            read_list_items(settings['url'], context_auth, "Tasks")
            task_item = create_list_item(settings['url'], context_auth, "Tasks")
            update_list_item(settings['url'], context_auth, "Tasks", task_item['Id'])
            delete_list_item(settings['url'], context_auth, "Tasks", task_item['Id'])
    
        else:
            print(context_auth.get_last_error())
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Vadim Gremyachev    6 年前

    如果您正在安装 Office365-REST-Python-Client package 不幸的是,从python包索引( 2.0.0 )已经过时,尤其是它不支持Python 3运行时,这可能是出现所提供错误的原因。

    尝试安装 最新版本 ( 2.1.1 )取而代之的是GitHub,如下所示:

    pip install git+https://github.com/vgrem/Office365-REST-Python-Client.git 
    

    enter image description here

    实例

    import json
    from office365.runtime.auth.authentication_context import AuthenticationContext
    from office365.runtime.client_request import ClientRequest
    from office365.runtime.utilities.request_options import RequestOptions
    from office365.sharepoint.client_context import ClientContext
    
    settings = {
        'url': 'https://contoso.sharepoint.com/',
        'user_credentials': {
            'username': '',
            'password': ''
        }
    }
    
    
    def read_list_items(context, list_title):
        """Read list items example"""
        request = ClientRequest(context)
        options = RequestOptions("{0}web/lists/getbyTitle('{1}')/items".format(context.service_root_url, list_title))
        options.set_header('Accept', 'application/json; odata=nometadata')
    
        print("Retrieving list items from List {0}".format(list_title))
        response = request.execute_request_direct(options)
        data = json.loads(response.content)
        for item in data['value']:
            print("Item title: {0}".format(item["Title"]))
    
    
    if __name__ == '__main__':
        ctx_auth = AuthenticationContext(url=settings['url'])
        if ctx_auth.acquire_token_for_user(username=settings['user_credentials']['username'],
                                           password=settings['user_credentials']['password']):
            target_list_title = "Tasks"
            ctx = ClientContext(settings['url'], ctx_auth)  # Initialize client context
            read_list_items(ctx, target_list_title)
        else:
            print(ctx_auth.get_last_error())