我想只能为特定的HTTP方法类型注册Plone中的视图,例如。仅针对POST,或者仅针对客户端提交的特定Accept:
标题。如何为特定的HTTP方法类型注册Plone视图
我知道使用常规ZCML配置指令来配置View是不太可能的。
是否有其他机制可以用于此目的,缺少编写代理视图,将请求委托给其他视图的HTTP方法等等?
我想只能为特定的HTTP方法类型注册Plone中的视图,例如。仅针对POST,或者仅针对客户端提交的特定Accept:
标题。如何为特定的HTTP方法类型注册Plone视图
我知道使用常规ZCML配置指令来配置View是不太可能的。
是否有其他机制可以用于此目的,缺少编写代理视图,将请求委托给其他视图的HTTP方法等等?
通常大多数视图都遵循更新/渲染模式,通常将它放在update方法中是一种常见的位置,可以像其他各种库一样执行权限/访问/数据完整性检查。一个完整的示范如下:
from AccessControl import Unauthorized
from zope.publisher.browser import BrowserPage
class PostOnlyPage(BrowserPage):
def update(self):
if not self.request.method == 'POST':
raise Unauthorized
def render(self):
return 'A POST only render'
def __call__(self):
self.update()
return self.render()
如果你这样做是为了使现有的库(如z3c.form
)执行访问方法,你可以考虑做这样的事情:
class StrictPostForm(z3c.form.form.PostForm):
def update(self):
if not self.request.method == 'POST':
raise Unauthorized
super(StrictPostForm, self).update()
我很想把这个功能加入到plone/zope中。 – vangheem
@ vangheem可能已经可以通过'plone.rest'(https://github.com/plone/plone.rest/blob/master/ src/plone/rest/events.py),但是将一个端点的不同视图注册到一个特定的层(比如'layer =“IPOST”'为正确的层,而默认视图为不支持的正确错误信息请求)是笨拙。 – metatoaster
因此,首先从IBeforeTraverseEvent订阅者中添加接口到请求,然后在这些接口上注册视图会有诀窍吗? – Petri