2016-04-19 17 views
-1

Gehen durch die Dokumentation von Pylon-Projekt wiki2 Tutorial fand diese Codes und was ich weiß ist eine Klasse hat eine Funktionsdefinition mit Einrückung nach der Klassendeklaration definiert. Überprüft auch die Python-Dokumentation und ist das gleiche, aber die Projektdokumentation hat so etwas wie eine Klassendefinition mit Einrückung und ohne Einrückung. Kann mir jemand das klar machen?Pylon Pyramide Klasse Funktion Definition Einrückung

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 

Ich habe die wenigen Zeilen Code aus der Dokumentation eingefügt, als wir die ersten beiden Funktion def eingekerbten sehen können, sind aber die dritte Funktion get_user nicht. Was genau ist der Zweck?

+0

Nicht sicher das Tutorial, aber das 'get_user' Funktion wird vermutlich verwendet, um mit' add_request_method', so dass request.user der aktuelle Benutzer ist (oder None) –

+0

ja das ist genau das, was du meinst, aber frage mich über den Einzug warum ist der Einzug nicht für die Funktionen wie andere Funktionen getan. Wie wir wissen, sind die Klassenmemberfunktionen eingerückt, aber warum nicht hier –

+0

Weil es eine unabhängige Funktion ist, keine Klassenmethode. Es könnte über der Klassendefinition liegen, es würde immer noch funktionieren. –

Antwort

1

get_user ist eine einfache Funktion, die später am Ende des Moduls mit config.add_request_method(get_user, 'user', reify=True) registriert wird. Dies ermöglicht die Verwendung von request.user innerhalb der Richtlinienmethoden.

0

Dies liegt daran, dass diese Funktion nicht mit der Klasse MyAuthenticationPolicy verknüpft ist. Zu dieser Klasse gehören nur die Funktionen mit Einzug. Die zusätzliche Funktion, über die Sie sprechen, wird wie oben erwähnt an den unteren Rand des Moduls gesetzt. diese Funktion ohne Einzug mit der anderen Funktion zugeordnet, die Sie hier nicht, wie in der Dokumentation zur Verfügung gestellt haben ihre in der Funktionsdefinition genannt unter

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)