浏览挂架项目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
我粘贴了文档中的几行代码,因为我们可以看到前两个函数def是缩进的,但第三个函数get_user不是。目的究竟是什么。
get_user
是一个简单的函数,稍后将使用config.add_request_method(get_user, 'user', reify=True)
在模块底部注册。这允许在策略方法中使用request.user
。
这是因为该函数未与类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)