我正在尝试将标记接口应用于请求,具体取决于当前用户。我们的想法是根据用户的喜好提供不同的皮肤。
所以我尝试使用Middleware-like hooks。在configure.zcml中:
<subscriber
for="Products.CMFCore.interfaces.ISiteRoot
zope.traversing.interfaces.IBeforeTraverseEvent"
handler=".layer.mark_layer"
/>
在layer.py中
def mark_layer(portal, event):
'''Conditional marking of the request according to the user
preferences.'''
request = event.request
portal_state = getMultiAdapter((portal, request), name="plone_portal_state")
anon = portal_state.anonymous()
print anon, portal.portal_membership.isAnonymousUser()
# more code here...
问题是plone总是报告用户是匿名的。
那么,在这种情况下,我该如何应用标记界面?
提前致谢。
答案 0 :(得分:3)
在遍历之后,用户才会确定。在Plone中,用户的身份验证和授权取决于上下文,并且在遍历完成之前无法确定。
因此,你必须加入IPubAfterTraversal
;在遍历完成并确定用户后,它会被传递。
<subscriber
for="ZPublisher.interfaces.IPubAfterTraversal"
handler=".layer.mark_layer"
/>
您必须使用getSite()
函数来检索门户网站:
from zope.app.component.hooks import getSite
def mark_layer(event):
site = getSite()
request = event.request
portal_state = getMultiAdapter((site, request), name="plone_portal_state")
# etc.
要明确:这意味着无法根据经过身份验证的用户改变在遍历期间找到的对象,因为在遍历完成后进行身份验证。渲染开始后,用户已经过身份验证。
这意味着您无法为每个用户主题注册一个页面,并希望能够在URL路径(/path/to/context/@@user-specific-page
)中使用该页面。在响应呈现期间查找的任何内容当然都是公平的游戏,因此使用标记界面可以改变除了发布遍历等代码查看的Viewlet,portlet,视图。