2016-04-19 2 views
-1

En parcourant la documentation du didacticiel wiki2 du projet pylon trouvé ce code et ce que je sais est une classe a une définition de fonction définie avec indentation après la déclaration de classe. Vérifié la documentation python aussi et est le même, mais la documentation du projet a quelque chose comme une définition de classe avec indentation et sans indentation. Quelqu'un peut-il me faire comprendre à ce sujet?pylône pyramide classe fonction définition indentation

from pyramid.authentication import AuthTktAuthenticationPolicy 
from pyramid.authorization import ACLAuthorizationPolicy 
from pyramid.security import (
    Authenticated, 
    Everyone, 
) 

from .models import User 


class MyAuthenticationPolicy(AuthTktAuthenticationPolicy): 
    def authenticated_userid(self, request): 
     user = request.user 
     if user is not None: 
      return user.id 

    def effective_principals(self, request): 
     principals = [Everyone] 
     user = request.user 
     if user is not None: 
      principals.append(Authenticated) 
      principals.append(str(user.id)) 
      principals.append('role:' + user.role) 
     return principals 

def get_user(request): 
    user_id = request.unauthenticated_userid 
    if user_id is not None: 
     user = request.dbsession.query(User).get(user_id) 
     return user 

J'ai collé les quelques lignes de codes de la documentation que nous pouvons voir les deux premiers def fonction sont en retrait, mais la troisième fonction get_user n'est pas. quel est le but exactement.

+0

ne suis pas sûr du tutoriel, mais cette fonction 'get_user' est probablement utilisé avec' add_request_method', de sorte que request.user est l'utilisateur actuel (ou None) –

+0

oui c'est exactement ce que vous voulez dire mais je m'interroge sur l'indentation pourquoi l'indentation n'est pas fait pour les fonctions comme d'autres fonctions. Comme nous le savons, les fonctions membres de la classe sont indentées mais pourquoi pas ici –

+0

Parce que c'est une fonction indépendante, pas une méthode de classe. Il pourrait être au-dessus de la définition de classe, cela fonctionnerait toujours. –

Répondre

1

get_user est une fonction simple qui est enregistrée plus tard dans la partie inférieure du module en utilisant config.add_request_method(get_user, 'user', reify=True). Cela permet l'utilisation de request.user dans les méthodes de stratégie.

0

C'est parce que cette fonction n'est pas associée à la classe MyAuthenticationPolicy. Seules les fonctions avec indentation appartiennent à cette classe. La fonction supplémentaire dont vous parlez est appelée au bas du module comme mentionné ci-dessus. cette fonction sans indentation est associée à l'autre fonction que vous n'avez pas fourni ici comme dans la documentation de son appelée dans la définition de la fonction ci-dessous

def includeme(config): 
    settings = config.get_settings() 
    authn_policy = MyAuthenticationPolicy(
     settings['auth.secret'], 
     hashalg='sha512', 
    ) 
    config.set_authentication_policy(authn_policy) 
    config.set_authorization_policy(ACLAuthorizationPolicy()) 
    config.add_request_method(get_user, 'user', reify=True)