====== Python: Twisted Perspective Broker ====== **Niveau Pro et intergalactique !**\\ Cette API: * a entre 15 et 20 ans * n'est que vaguement maintenu * un exemple au moins ne marche pas * le tranfert de datas simples marche * le transfert d'objets complexes ne marche pas * les exemples ne respectent pas le PEP 8, c'est imbriqué au possible * **{{tagpage>perspectivebroker|Toutes les pages Twisted Perspective Broker}}** * **[[using_perspective_broker|Page suivante]]** Using Perspective Broker * **[[https://github.com/sergeLabo/PB|Les fichiers sources]]** **Traduction Google de [[https://twistedmatrix.com/documents/current/core/howto/pb-intro.html|Introduction to Perspective Broker]] améliorée par un humain ayant fait intergalactique en 1ère langue !** =====Introduction Perspective Broker===== **La page suivante est [[using_perspective_broker|Using Perspective Broker]]** ====Introduction==== Supposons que vous vous retrouviez dans le contrôle des deux extrémités du fil: vous avez deux programmes qui doivent se parler et vous pouvez utiliser n'importe quel protocole. Si vous pouvez penser à votre problème en termes d'objets nécessitant des appels de méthode, il est alors probable que vous puissiez utiliser le protocole Perspective Broker de Twisted plutôt que d'essayer d'intégrer vos besoins dans HTTP, ou encore d'implémenter un autre mécanisme RPC. Le système Perspective Broker (en abrégé «PB») repose sur quelques concepts centraux: * serialization = sérialisation : prendre des objets et des types assez arbitraires, les transformer en un bloc d'octets, les envoyer sur un fil, puis les reconstituer à l'autre extrémité. En surveillant attentivement les identifiants d'objet, les objets sérialisés peuvent contenir des références à d'autres objets et la copie distante sera toujours utile. * remote method calls = appels de méthodes distantes : faire quelque chose sur un objet local et provoquer l'exécution d'une méthode distante. L'objet local est appelé [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.RemoteReference.html|RemoteReference]] et vous «faites quelque chose» en exécutant sa méthode .callRemote . Ce document contiendra plusieurs exemples qui sembleront redondants et verbeux une fois que vous aurez compris ce qui se passe. Pour commencer, une grande partie du code sera simplement étiquetée «magic»: il n'est pas nécessaire de comprendre; il sera expliqué plus en détail plus tard. ====Feuille de route de l'objet==== Pour commencer, voici les principales classes, interfaces et fonctions impliquées dans PB, avec des liens vers le fichier où elles sont définies (qui sont toutes sous twisted bien sûr). Ne vous souciez pas de comprendre ce qu'ils font tous encore: il est plus facile de les comprendre grâce à leur interaction que de les expliquer un par un. * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.internet.protocol.Factory.html|Factory]] : internet/protocol.py * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.PBServerFactory.html|PBServerFactory]] : spread/pb.py * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Broker.html|Broker]] : spread/pb.py Autres classes impliquées à un moment donné: * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.RemoteReference.html|RemoteReference]] : spread/pb.py * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Root.html|pb.Root]] : spread/pb.py , défini comme twisted.spread.flavors.Root dans spread/flavors.py * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Referenceable.html|pb.Referenceable]] : spread/pb.py , défini comme twisted.spread.flavors.Referenceable dans spread/flavors.py Classes et interfaces impliquées lorsque vous commencez à vous soucier de l'autorisation et de la sécurité: * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.cred.portal.Portal.html|Portal]] : cred/portal.py * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.cred.portal.IRealm.html|IRealm]] : cred/portal.py * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.IPerspective.html|IPerspective]] : spread/pb.py , avec lequel vous interagirez généralement via [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Avatar.html|pb.Avatar]] (un implémenteur de base de l'interface). ====Sous-classement et mise en œuvre==== class A: pass class B(A): pass **Si une class B hérite d'une autre class A, B est une sous class de A.** Techniquement, vous pouvez sousclasser tout ce que vous voulez, mais techniquement, vous pouvez aussi écrire un tout nouveau framework, ce qui vous fera perdre beaucoup de temps. Connaître les classes utiles à la sous-classe ou les interfaces à implémenter est l'une des connaissances essentielles à la réussite de l'utilisation de PB (et de Twisted). Voici quelques conseils pour commencer: * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Referenceable.html|pb.Root]] , [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Referenceable.html|pb.Referenceable]] : vous les sousclassez pour créer des objets à distance référençables (c.-à-d. des objets sur lesquels vous pouvez appeler des méthodes à distance) en utilisant PB. Vous n'avez pas besoin de modifier le comportement existant, il vous suffit d'en hériter et d'ajouter les méthodes accessibles à distance que vous souhaitez exporter. * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Avatar.html|pb.Avatar]] : Vous serez en train de sousclasser cela lorsque vous entrerez dans la programmation PB avec autorisation. Ceci est un implémenteur de IPerspective. * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.cred.checkers.ICredentialsChecker.html|ICredentialsChecker]] : Implémentez ceci si vous souhaitez authentifier vos utilisateurs contre une sorte de magasin de données: par exemple, une base de données LDAP, un SGBDR, etc. Il existe déjà quelques implémentations pour différents back-end dans twisted.cred.checkers. ====Les choses que vous pouvez appeler à distance==== À cette écriture, il existe trois «saveurs» d’objets accessibles à distance via des objets [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.RemoteReference.html|RemoteReference]] . Chacune de ces variantes possède une règle sur la manière dont le message callRemote est transformé en appel de méthode local sur le serveur. Pour utiliser l'une de ces «saveurs», sous-classez-les et nommez vos méthodes publiées avec le préfixe approprié. * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.IPerspective.html|twisted.spread.pb.IPerspective]] implémenteurs C'est la première interface avec laquelle nous traitons. C'est une «perspective» sur votre application PB. Les perspectives sont un peu spéciales car elles sont généralement le premier objet auquel un utilisateur donné peut accéder dans votre application (après sa connexion). Un utilisateur ne devrait recevoir qu'une référence à sa propre perspective. PB s'efforce de vérifier, autant que faire se peut, que toute méthode pouvant être appelée directement dans une perspective est appelée au nom de l'utilisateur représenté par cette perspective. (Les services avec des exigences inhabituelles pour «pour le compte de», telles que les simulations avec la possibilité de posséder l'avatar d'un autre joueur, sont réalisés en fournissant un accès indirect au point de vue d'un autre utilisateur.) Les perspectives ne sont généralement pas sérialisées en tant que références distantes. Ne renvoyez donc pas directement un exécuteur IPerspective. La façon dont la plupart des gens voudront implémenter IPerspective est de sous-classer pb.Avatar. Les méthodes accessibles à distance sur les instances pb.Avatar sont nommées avec le préfixe perspective_ . * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Referenceable.html|twisted.spread.pb.Referenceable]] Les objets référençables sont le type d'objet PB le plus simple. Vous pouvez appeler des méthodes sur ces méthodes et les renvoyer à partir de méthodes permettant d'accéder aux méthodes des autres objets. Cependant, lorsqu'une méthode est appelée sur un objet référençable, il n'est pas possible de dire qui l'a appelée. Les méthodes accessibles à distance sur les référenceables sont nommées avec le préfixe remote_ . * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Viewable.html|twisted.spread.pb.Viewable]] Les objets visualisables sont des objets pouvant être référencés à distance et qui nécessitent en outre la possibilité de savoir qui les appelle. La liste d'arguments des méthodes distantes d'une Viewable est modifiée afin d'inclure la perspective représentant l'utilisateur appelant. Les méthodes accessibles à distance sur les affichages sont nommées avec le préfixe view_ . ====Les choses que vous pouvez copier à distance==== En plus de renvoyer des objets sur lesquels vous pouvez appeler des méthodes distantes, vous pouvez renvoyer des copies structurées d'objets locaux. Deux variantes de base permettent de copier des objets à distance. Encore une fois, vous pouvez les utiliser en les sous-classant. Afin de spécifier l'état que vous souhaitez copier lorsque ceux-ci sont sérialisés, vous pouvez soit utiliser le __getstate__ ou méthode spécialisée par défaut de Python pour cette saveur. * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Copyable.html|twisted.spread.pb.Copyable]] C'est le type d'objet le plus simple qui peut être copié. Chaque fois que cet objet est renvoyé par une méthode ou transmis en tant qu'argument, il est sérialisé et dé-sérialisé. [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Copyable.html|Copyable]] fournit une méthode que vous pouvez remplacer, getStateToCopyFor(perspective) , qui vous permet de décider à quoi un objet va ressembler pour la perspective qui le demande. L'argument perspective sera la perspective qui transmet un argument ou renvoie un résultat, une instance de votre classe Copyable. Pour des raisons de sécurité, afin de permettre la copie d'une classe Copyable particulière, vous devez déclarer un gestionnaire RemoteCopy pour cette sous-classe Copyable. Le moyen le plus simple est de déclarer les deux dans le même module, comme ceci: from twisted.spread import flavors class Foo(flavors.Copyable): pass class RemoteFoo (flavors.RemoteCopy): pass flavors.setUnjellyableForClass(Foo, RemoteFoo) Dans ce cas, chaque fois qu'un Foo est copié entre pairs, un RemoteFoo sera instancié et rempli avec l'état de Foo. Si vous ne le faites pas, PB se plaindra qu'il y a eu des violations de la sécurité, et la connexion pourrait être fermée. * [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|twisted.spread.pb.Cacheable]] Permettez-moi de commencer par un avertissement: [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|Cacheable]] peut être difficile à comprendre. La motivation à cela peut ne pas être claire si vous n'avez pas d'expérience avec les applications du monde réel qui utilisent des méthodes d'appels à distance. Une fois que vous avez compris pourquoi vous en avez besoin, ce que vous faites peut paraître simple et évident, mais si vous vous trompez, oubliez-le et revenez plus tard. Il est possible d'utiliser PB sans comprendre [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|Cacheable]] du tout. [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|Cacheable]] est une saveur conçue pour être copiée uniquement lorsque cela est nécessaire et mise à jour à la volée au fur et à mesure des modifications. Lorsqu'elle est transmise en tant qu'argument ou valeur de retour, si une mise en cache existe du côté de la connexion sur laquelle elle est copiée, elle sera appelée par ID et non copiée. [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|Cacheable]] est conçu pour minimiser les erreurs liées à la réplication d'un objet entre plusieurs serveurs, en particulier ceux liés aux informations obsolètes. Pour ce faire, [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|Cacheable]] enregistre automatiquement les états des observateurs et des requêtes, ensemble. Vous pouvez remplacer la méthode getStateToCacheAndObserveFor(self, perspective, observer) afin de spécifier comment vos observateurs seront stockés et mis à jour. Semblable à getStateToCopyFor , getStateToCacheAndObserveFor reçoit une perspective. Il reçoit également un observer , qui est une référence distante à une quatrième version référençable «secrète»: [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.RemoteCache.html|RemoteCache]] . Un [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.RemoteCache.html|RemoteCache]] est simplement l'objet qui représente votre [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|Cacheable]] de l'autre côté de la connexion. Il est enregistré en utilisant la même méthode que [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.RemoteCopy.html|RemoteCopy]] , ci-dessus. RemoteCache est différent, cependant, car il sera référencé par son homologue. Il agit en tant que référenceur, où toutes les méthodes préfixées par observe_ seront appelables à distance. Il est recommandé à votre objet de maintenir une liste d'observateurs (note: support de la bibliothèque à venir!) Et de les mettre à jour à l'aide de callRemote lorsque la mise en callRemote modifie de manière à être perceptible par ses clients. Enfin, lorsque toutes les références à un [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|Cacheable]] depuis une perspective donnée sont perdues, stoppedObserving(perspective, observer) sera appelé sur [[https://twistedmatrix.com/documents/18.7.0/api/twisted.spread.pb.Cacheable.html|Cacheable]], avec la même paire perspective / observateur avec laquelle getStateToCacheAndObserveFor a été initialement appelé. Tous les appels distants de nettoyage peuvent être effectués à cet endroit, tout comme la suppression de l'objet observateur de toutes les listes dans lesquelles il se trouvait auparavant. Tout appel supplémentaire à cet objet observateur sera invalide. **La page suivante est [[using_perspective_broker|Using Perspective Broker]]** {{tag>python sb intergalactique twisted perspectivebroker}}