我有一个浏览器视图,带有一些实用程序。主要是一个“实用工具视图”,我使用旧式的pt模板(在skins文件夹中)遍历它。我的browser/configure.zcml
<browser:page
for="*"
name="my_view"
class=".myview.MyView"
allowed_interface=".myview.IMyView"
permission="my.permission"
/>正如您所看到的,它有一个自定义权限:这是必需的,因为匿名用户无法呈现此视图,而此权限实际上是特定于我的门户中的特定情况的。
我想:我要尝试在我的template.pt中呈现视图:因为我已经在browser/configure.zcml中设置了权限,当尝试呈现Plone时,它本身将为我处理这个问题。所以我在我的模板中这样做了
<span tal:define="my_view here/@@myview">
</span>到现在为止还好。没有my.permission的用户尝试进入/Plone/template.pt将会失败。但是Plone会重定向到登录表单,而我更喜欢抛出一个禁止的异常。类似于:
<span tal:define="my_view here/@@myview | here/raiseForbidden">
</span>当然,...but不起作用,因为视图呈现没有抛出错误。(我知道here/raiseForbidden不存在,通常使用的是here/raiseUnauthorized,但概念是一样的)
我的问题是:有可能做到这一点吗?在某个地方配置我的权限,或者在我的视图中配置一些方法(如render或__call__),当用户没有权限呈现它时,an exception like Forbidden is raised
发布于 2011-08-05 16:12:12
Plone重定向到登录表单,因为您引发了未授权的。如果你想要不同的行为,你需要做一些不同的事情。
在这种情况下,您可以直接将用户重定向到一个新页面,其中包含针对该情况量身定做的错误消息。
发布于 2011-08-05 06:47:32
实际上你不需要这样做:
"tal:define="my_view此处/@@myview>“
因为对于浏览器视图,有一个名为"view“的默认变量,它已经包含了您的类。
对于引发异常,您应该从zml指令中删除权限检查,并修改您的类,如下所示:
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from AccessControl import getSecurityManager
from AccessControl import Unauthorized
class YourBrowserView(BrowserView):
""" .. """
index = ViewPageTemplateFile("templates/yourtemplate.pt")
...
def __call__(self):
if not getSecurityManager().checkPermission(your.permission, self.context):
raise Unauthorized("You are not authorized! Go away!")
else: return index()再见贾科莫
https://stackoverflow.com/questions/6948507
复制相似问题