[PYTHON] Fügen Sie die Verarbeitung vor und nach der Ansichtsfunktion mit Pyramids eigenem Ansichtsdekorator ein

[20.03.2015 Aktualisiert auf den Inhalt verschiedener Untersuchungen. Etwas anderes]

Die Benutzerauthentifizierung ist verfügbar und der Benutzername wird im Kopfbereich eines beliebigen Bildschirms auf der authentifizierten Seite angezeigt. Die Standardverarbeitung beim Erstellen einer gemeinsamen Webanwendung wird automatisiert.

def permission_view_config(permission):
    def pvc(**params):
        settings = dict(permission=permission, _depth=1)
        settings.update(params)

        def wrapped_view_config(original_func):
            return view_config(**settings)(original_func)
        return wrapped_view_config
    return pvc


user_view_config = permission_view_config('user')
admin_view_config = permission_view_config('admin')

__init__.py


def groupfinder(user_code, request):
    if not request.user:
        return []
    elif request.user.is_admin:
        return ['group:users', 'group:admin']
    else:
        return ['group:users']


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


class RootFactory(object):
    __acl__ = [
        (Allow, 'group:users', 'user'),
        (Allow, 'group:admin', 'admin')
    ]

    def __init__(self, request):
        pass


def main(global_config, **settings):
    # ...
    config = Configurator(settings=settings, root_factory='.RootFactory')

    #Holen Sie sich, wenn Sie auf die Benutzereigenschaft der Anfrage zugreifen_Geben Sie an, dass Sie ein Benutzer sein sollen. Das ist wichtig.
    config.set_request_property(get_user, 'user', reify=True)

    authn_policy = AuthTktAuthenticationPolicy('...', callback=groupfinder, hashalg='sha512')
    authz_policy = ACLAuthorizationPolicy()
    config.set_authentication_policy(authn_policy)
    config.set_authorization_policy(authz_policy)
    # ...

Wenn Sie es so verwenden

views.py


@user_view_config(route_name='index', renderer='templates/index.jinja2')
def index(request):
    #Dies gilt nur für Personen mit Benutzerberechtigung
    do_something_with(request.user)  #Benutzer kann verwendet werden
    return {'name': 'my_app'}

@admin_view_config(route_name='index', renderer='templates/add_user.jinja2')
def add_user(request):
    #Dies gilt nur für Benutzer mit Administratorrechten
    do_something_with(request.user)  #Benutzer kann verwendet werden
    return {'name': 'my_app'}

inspiriert von Implementieren eines benutzerdefinierten Ansichtsdekorators mit Pyramide

Recommended Posts

Fügen Sie die Verarbeitung vor und nach der Ansichtsfunktion mit Pyramids eigenem Ansichtsdekorator ein
Benachrichtigen Sie den Inhalt der Aufgabe vor und nach der Ausführung der Aufgabe mit Fabric
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
So definieren Sie Decorator und Decomaker mit einer Funktion
Entfernen Sie Leerzeichen in voller Breite vor und nach der Zeichenfolge (Python).
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[C / C ++] [GCC] __attribute __ ((Konstruktor)), um die Verarbeitung vor und nach main auszuführen