code_rum
code_rum

Reputation: 922

Listing files and folder in Sharepoint with Office365-REST-Python-Client responds : 404 not found error

I am trying to list files from a folder. It works with folder name with spaces but doesn't work when folder name contains '#'.

I am getting below error office365.runtime.client_request_exception.ClientRequestException: ('-1234456, System.IO.FileNotFoundException', 'File Not Found.', "404 Client Error)

from office365.sharepoint.files.file import File
from office365.sharepoint.folders.folder import Folder
from office365.runtime.auth.client_credential import ClientCredential

app_principal = {
    'id': 'xxxxxxxx',
    'secret_id': 'xxxxxxxx',
}

baseurl = 'xxxx.sharepoint.com'
basesite = '/xxx/xxx'
siteurl = baseurl + basesite

credentials = ClientCredential(app_principal['id'], app_principal['secret_id'])
ctx = ClientContext(siteurl).with_credentials(credentials)


def enum_folder(parent_folder, fn):
    """
    :type parent_folder: Folder
    :type fn: (File)-> None
    """
    parent_folder.expand(["Files", "Folders"]).get().execute_query()
    for file in parent_folder.files:  # type: File
        fn(file)
    for folder in parent_folder.folders:  # type: Folder
        enum_folder(folder, fn)


def print_file(f):
    print(f.properties['ServerRelativeUrl'])


target_folder_url = "Documents/Configs files/testfolder#123"
root_folder = ctx.web.get_folder_by_server_relative_url(target_folder_url)
enum_folder(root_folder, print_file)

Upvotes: 2

Views: 1459

Answers (1)

Greyfox
Greyfox

Reputation: 43

I didnt user credentials when using app principal try this:

from office365.sharepoint.client_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext


#datos de la APP solicitada
app_principal = {
    "client_id": 'YOUR_APP_CLIENT_ID',
    "client_secret": 'YOUR_APP_CLIENT_SECRET',
}



server_url = "https://XXXXXX.sharepoint.com/"
site_url = server_url + "sites/XXXXXX"

context_auth = AuthenticationContext(site_url)
context_auth.acquire_token_for_app(
    client_id=app_principal["client_id"], client_secret=app_principal["client_secret"]
)
# returns True

ctx = ClientContext(site_url, context_auth)
web = ctx.web
ctx.load(web)
ctx.execute_query()
print("Web title: {0}".format(web.properties['Title']))

def enum_folder(parent_folder, fn):
    """
    :type parent_folder: Folder
    :type fn: (File)-> None
    """
    parent_folder.expand(["Files", "Folders"]).get().execute_query()
    for file in parent_folder.files:  # type: File
        fn(file)
    for folder in parent_folder.folders:  # type: Folder
        enum_folder(folder, fn)

def print_file(f):
    print(f.properties['ServerRelativeUrl'])
    

target_folder_url= "NAME_OF_YOUR_FOLDER"
root_folder= ctx.web.get_folder_by_server_relative_url(target_folder_url)
enum_folder(root_folder, print_file)

Upvotes: 1

Related Questions