2016-04-19 2 views
-1

Просматривая документацию по проекту pylon wiki2, мы обнаружили, что эти коды и то, что я знаю, имеет определение функции, определенное с отступом после объявления класса. Также проверял документацию на python и тот же, но в документации по проекту есть что-то вроде определения класса с отступом и без отступов. Может ли кто-нибудь объяснить мне это.определение функции класса пирамиды пилона

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 

Я вставил несколько строк коды из документации, как мы видим, первые две функции размораживания с отступом, но третья функция get_user нет. в чем же цель.

+0

Не уверен в учебнике, но 'get_user' функция, вероятно, используется с' add_request_method', так что request.user является текущим пользователем (или None) –

+0

да, это именно то, что вы имеете в виду, но меня интересует вопрос о том, почему отступ не выполняется для функций, подобных другим функциям. Поскольку мы знаем, что функции члена класса отступают, но почему бы и нет здесь –

+0

Потому что это независимая функция, а не метод класса. Это может быть выше определения класса, оно все равно будет работать. –

ответ

1

get_user - это простая функция, зарегистрированная позже в нижней части модуля с использованием config.add_request_method(get_user, 'user', reify=True). Это позволяет использовать методы политики request.user.

0

Это потому, что эта функция не связана с классом MyAuthenticationPolicy. Только функции с отступом принадлежат этому классу. Дополнительную функцию, о которой вы говорите, вызывается в нижней части модуля, как упоминалось выше. что функция без отступа связана с другой функцией, что вы еще не представили здесь, как и в документации его называют в определении функции ниже

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) 
Смежные вопросы