Office365-rest-python-client: Impossible d'accéder aux informations sur mes listes SharePoint, l'URL de la ressource de liste semble incorrecte

Créé le 28 août 2020  ·  5Commentaires  ·  Source: vgrem/Office365-REST-Python-Client

Voici ce que j'utilise.

site_url = "https://mycompany.sharepoint.com/sites/mysite/"
clientid = "12345"
clientsecret = "67890"
clientcredentials = ClientCredential(clientid, clientsecret)
ctx = ClientContext(site_url).with_credentials(clientcredentials)
target_list = "ListIWant"
list_object = ctx.web.lists.get_by_title(target_list)
items = list_object.get_items()
ctx.load(items)
ctx.execute_query()

Tout se déroule sans erreur, mais au final mon list_object n'a pas d'éléments ou de champs... Quand je regarde le resource_url dans le list_object, ce n'est pas la bonne URL. Il y a des barres obliques inverses supplémentaires devant et derrière le nom de la liste. Supprimer les barres obliques et copier dans la barre d'adresse Edge télécharge un fichier XML contenant des informations sur la liste, mais tel quel, cela ne fonctionnera pas... donc je suppose que c'est la cause de l'erreur... mais je ne le fais pas. t comment y remédier.

J'ai l'impression d'être si proche... quelqu'un peut-il m'aider ?
example

question

Tous les 5 commentaires

Tu y es presque.
Votre objet items est de type ListItemCollection .
Si vous essayez len(items) , cela devrait renvoyer le nombre d'articles de la collection
Et vous pouvez maintenant énumérer ces éléments :

for item in items:
    print(item.properties)

chaque élément est maintenant de type ListItem que vous pouvez manipuler

De plus, les barres obliques inverses supplémentaires servent à échapper le ' dans la chaîne python, ce sont tout à fait normaux

Tu y es presque.
Votre objet items est de type ListItemCollection .
Si vous essayez len(item) , cela devrait renvoyer le nombre d'articles de la collection
Et vous pouvez maintenant énumérer ces éléments :

for item in items:
    print(item.properties)

chaque élément est maintenant de type ListItem que vous pouvez manipuler

Merci de votre aide mais print(len(items)) renvoie 0

Si ce n'est pas un problème avec le resource_url. cela pourrait-il être un problème avec les autorisations d'application que j'ai définies pour le site SharePoint ? J'ai suivi les instructions de https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azureacs (y compris la définition de la demande d'autorisation XML), mais quand je reviens au _layouts/15 /appinv.aspx et regardez mon identifiant client, le champ XML de demande d'autorisation est toujours vide... C'est la première fois que je fais cela donc je ne sais pas si c'est comme ça que ça doit fonctionner ou non.

J'ai utilisé ces paramètres pour le xml (et je sélectionne évidemment faire confiance à l'application).

   <AppPermissionRequests AllowAppOnlyPolicy="true">
   <AppPermissionRequest Scope="http://mycompany.sharepoint.com/sites/mysite" Right="FullControl" />
   </AppPermissionRequests>

C'est un peu différent de ce qui figurait dans les instructions que j'ai trouvées sur docs.microsoft.com, mais je n'ai la possibilité que d'accorder l'accès à mon site, pas au locataire. L'application est répertoriée dans les "Autorisations de l'application de la collection de sites" par la suite, donc je suppose que cela fonctionne ... mais le fait que je ne vois aucune autorisation XML lorsque je reviens à appinv.aspx.

Bonne question, dans ma mémoire, lorsque je traitais des problèmes de permission, c'était très clair.
Votre application réellement approuvée serait à _layouts/15/AppPrincipals.aspx
Et il est normal que vous ne voyiez pas le xml sur appinv.

Si ma mémoire est bonne, la portée que j'ai utilisée était de http://sharepoint/site/sitecollection cependant
(Edit :) Voici une aide-mémoire : https://medium.com/ng-sp/sharepoint-add-in-permission-xml-cheat-sheet-64b87d8d7600

As-tu essayé de te connecter à l'API via le facteur ?

Voici ce que je reçois de l'interprète avec ma connexion actuelle.

>>> items = ctx.web.lists.get_by_title('Events').items
>>> items
<office365.sharepoint.listitems.listItem_collection.ListItemCollection object at 0x10d064af0>
>>> len(items)
0
>>> ctx.load(items)
>>> ctx.execute_query()
>>> len(items)
2

Les salutations,

Tu y es presque.
Votre objet items est de type ListItemCollection .
Si vous essayez len(items) , cela devrait renvoyer le nombre d'articles de la collection
Et vous pouvez maintenant énumérer ces éléments :

for item in items:
    print(item.properties)

chaque élément est maintenant de type ListItem que vous pouvez manipuler

De plus, les barres obliques inverses supplémentaires servent à échapper le ' dans la chaîne python, ce sont tout à fait normaux

d'accord et en effet des barres obliques inverses supplémentaires sont obligatoires pour échapper au caractère apostrophe pour rendre l' URL OData valide

Ce commentaire semble faire la lumière sur la cause première :

J'ai utilisé ces paramètres pour le xml (et je sélectionne évidemment faire confiance à l'application).

   <AppPermissionRequests AllowAppOnlyPolicy="true">
   <AppPermissionRequest Scope="http://mycompany.sharepoint.com/sites/mysite" Right="FullControl" />
   </AppPermissionRequests>

C'est un peu différent de ce qui figurait dans les instructions que j'ai trouvées sur docs.microsoft.com, mais je n'ai la possibilité que d'accorder l'accès à mon site, pas au locataire. L'application est répertoriée dans les "Autorisations de l'application de la collection de sites" par la suite, donc je suppose que cela fonctionne ... mais le fait que je ne vois aucune autorisation XML lorsque je reviens à appinv.aspx.

la portée fournie semble _invalide_ : http://mycompany.sharepoint.com/sites/mysite

  • mycompany : doit être sharepoint un espace réservé prédéfini à la place
  • sites/mysite même, doit être un espace réservé _valid_, par exemple content/sitecollection ou content/sitecollection/web

Ainsi, la solution serait d' accorder des autorisations d'application en fournissant une demande d'autorisations _valide_, par exemple :

par collection de sites :

<AppPermissionRequests AllowAppOnlyPolicy="true">
  <AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="FullControl" />
</AppPermissionRequests>

par toile :

<AppPermissionRequests AllowAppOnlyPolicy="true">
  <AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="FullControl" />
</AppPermissionRequests>

La liste des _étendues d'autorisation_ se trouve sur la page Autorisations de complément dans SharePoint

Et enfin, il existe une page wiki qui fournit également des instructions étape par étape sur la configuration du principal de l'application et l'octroi d'autorisations.

Merci! Oui. La portée de l'autorisation XML semble avoir été à l'origine du problème !
D'après mes premiers tests, cela semble fonctionner maintenant.

C'est bien. J'utilise des scripts VBA dans MS Access depuis un an pour mettre à jour mes listes SharePoint. Le fait d'avoir compris cette partie me rapproche un peu plus du portage de tout sur Python.

Cette page vous a été utile?
0 / 5 - 0 notes