À propos de Python Pyramid Traversal

J'ai essayé de toucher le framework Web Python Pyramid. Cet article est un mémorandum se concentrant sur des choses qui sont susceptibles de se faire prendre, telles que "Alors que faire lors de la mise en œuvre réelle", en omettant les bases de "J'ai essayé de l'installer".

Traversée

En plus de l'envoi d'URL familier, Pyramid dispose d'une méthode de mappage d'URL appelée Traversal.

En ce qui concerne la traversée, seules les choses conceptuelles sont décrites dans l'explication du site anglais original, et même si vous recherchez le vaste réseau, il y a plusieurs descriptions, mais il semble que l'interprétation (?) Est différente pour chacun, et la méthode de mise en œuvre est Faux.

Cependant, pour mettre en œuvre le contrôle d'accès, il semble que la traversée doive être utilisée comme dans l'exemple du site d'origine, et tant que le site est créé avec Pyramid, cela ne peut être évité.

Concept de traversée et dictionnaire Python

Puisque le concept de traversée est décrit dans la famille head, l'explication détaillée est omise, mais en termes simples, chaque élément de l'URL est considéré comme la valeur clé du dictionnaire Python imbriqué, et la dernière clé restante est le nom de la vue et la dernière. Il s'agit d'une méthode de mappage d'URL dans laquelle l'élément qui frappe est le contexte (cible de l'opération).

Par exemple, si l'URL permettant de modifier les informations utilisateur du compte "testutilisateur" d'un site est "http://example.com/account/testuser/edit", en traversée

-- Root ['account'] ['testuser'] L'élément obtenu par `` `est une ressource --edit``` est le nom de la vue

Sera. La racine ci-dessus est décrite par commodité, mais c'est en fait l'élément de départ de la traversée et c'est une ressource générée chaque fois qu'il y a une demande de l'utilisateur. Il y a une erreur, mais http://example.com peut être considéré comme la ressource racine de ce site.

Pour le résumer correctement, il est écrit comme ci-dessus, mais il frappe le mur immédiatement.

Implémentation du compte utilisateur à l'aide de la traversée

Le contenu ci-dessus est déjà décrit (bien qu'en anglais) sur le site Web d'origine. Si vous prenez le site d'origine comme une hirondelle, la mise en œuvre des ressources liées aux comptes utilisateurs sera la suivante.

def site_root_factory(request):
    root = dict()
    root['account'] = dict()
    root['account']['testuser'] = request.dbsession.Query(User).filter(name = 'testuser').first()

Quant à Atari Mae, on ne peut pas dire qu'il s'agit d'une implémentation. Même s'il s'agit d'un site fixe, il est naturel que le compte utilisateur puisse être «enregistré» / «supprimé», et il n'en est pas toujours un, par exemple, que se passe-t-il si «surfeur» est ajouté?

En d'autres termes, si vous souhaitez créer un site Web transversal et dynamique, vous ne pouvez pas simplement implémenter la ressource en tant que dictionnaire Python et ses éléments.

Méthode d'implémentation par classe de ressources

Une ressource n'est pas simplement un'dictionary `dict () '` , mais une classe / objet qui implémente la méthode`` getitem. Si ce n'est pas écrit, ce sera difficile pour les débutants. getitem```Qu'Est-ce que c'est? C'est la preuve que vous n'avez pas lu la documentation originale de python, vous devriez donc la lire maintenant.

En utilisant l'exemple ci-dessus, l'élément obtenu par la clé'account'peut être implémenté comme la classe AccountFactory suivante qui implémente `` `__ getitem__```.

class AccountResource(object):
    def __init__(self, parent, request, model):
         self.request = request
         self.model = model
         self.parent = parent

    @property
    def __name__(self):
         return self.model.name

    @property
    def __parent__(self):
         return self.parent


class AccountFactory(object):
    def __init__(self, parent, request):
         self.request = request
         self.parent  = parent

    @property
    def __name__(self):
         return 'account'

    @property
    def __parent__(self):
         return self.parent

    def __getitem__(self, key):
         m = self.request.dbsession.Query(User).filter(name = key).first()
         if m: 
             reurn m
         else: 
             raise KeyError(key)


def site_root_factory(request):
    root = dict()
    root['account'] = AccountFactory(root, request)

Maintenant, lorsque `root ['account'] ['testuser']` est appelé, la méthode __ getitem__ de ʻAccountFactory sera` `` `key = 'testuser Appelé avec', le modèle User sera désormais appelé comme contexte final.

Pour définir une vue d'édition qui manipule ce contexte (modèle utilisateur), par exemple:

@view_config(name='edit', context='User', renderer='editview.jinja2')
def edit(context, request)
    #context est le modèle utilisateur obtenu à la suite de la traversée
    #Le processus de fonctionnement du modèle utilisateur est décrit ci-dessous.

Pour une raison quelconque, il n'y avait pas d'exemple de traversée lorsque l'accès à la base de données s'est produit comme dans l'exemple ci-dessus, il est donc décrit ici.

Statut

Il n'y a presque pas de littérature japonaise. Je devine.

Même s'il y a une installation Pyramid de routine et un article "Commencé!". Que diriez-vous du fait qu'il n'y a qu'une seule chose ici à l'époque où vous pouvez l'installer rapidement avec pip? Je pense, mais que dois-je faire avec l'article sur la méthode d'installation tel que décrit sur le site d'origine?

Recommended Posts

À propos de Python Pyramid Traversal
À propos des tranches Python
À propos de la notation d'inclusion de python
À propos de Python tqdm.
À propos de python, classe
À propos de l'héritage Python
À propos de python, range ()
À propos de la référence Python
À propos des décorateurs Python
[Python] À propos du multi-processus
À propos de Python for loop
À propos des arguments de fonction (python)
À propos de Python, pour ~ (plage)
[Python] Mémo sur les erreurs
À propos de l'environnement de développement Python
Python: à propos des arguments de fonction
Python, à propos de la gestion des exceptions
À propos de Python3 ... (objet Ellipsis)
[Python] Chapitre 01-01 À propos de Python (First Python)
[Python] À propos de l'entrée standard
À propos de __all__ en python
[Python] En savoir plus sur pip
Prise en charge de Fabric pour Python 3
À propos des objets et des classes Python
À propos des variables et des objets Python
À propos du module Python venv
fonction de mémorandum python pour débutant
À propos de la fonction enumerate (python)
À propos de divers encodages de Python 3
À propos de Python, len () et randint ()
À propos de Perl, Python, PHP, Ruby
Un mémorandum sur le simulacre de Python
À propos des opérateurs de comparaison de chaînes Python
À propos de Python et des expressions régulières
À propos des fonctionnalités de Python
À propos de "for _ in range ():" de python
À propos des opérations Python et OS
Python # À propos de la référence et de la copie
À propos de Python sort () et reverse ()
Une note sur [python] __debug__
Python
[Python] Écrivons brièvement la notation d'inclusion
À propos de Python dict et des fonctions triées
À propos de Python et Cython dtype
[Python] Qu'est-ce que @? (À propos des décorateurs)
Ce qui était surprenant dans les classes Python
À propos de Python Pickle (cPickle) et Marshal
[Python] À propos des classes Executor et Future
À propos de Python, à partir et à l'importation, comme
pyramide
J'ai essayé d'étudier le processus avec Python
À propos de la liste de base des bases de Python
Une note sur mock (bibliothèque fictive Python)
À propos de la création de l'interface graphique à l'aide de TKinter de Python
[Python Kivy] À propos de la modification du thème de conception
À propos de l'environnement virtuel de Python version 3.7
Mémorandum des débutants en python