2015-06-30 34 views
3

我想只能为特定的HTTP方法类型注册Plone中的视图,例如。仅针对POST,或者仅针对客户端提交的特定Accept:标题。如何为特定的HTTP方法类型注册Plone视图

我知道使用常规ZCML配置指令来配置View是不太可能的。

是否有其他机制可以用于此目的,缺少编写代理视图,将请求委托给其他视图的HTTP方法等等?

+0

我很想把这个功能加入到plone/zope中。 – vangheem

+1

@ vangheem可能已经可以通过'plone.rest'(https://github.com/plone/plone.rest/blob/master/ src/plone/rest/events.py),但是将一个端点的不同视图注册到一个特定的层(比如'layer =“IPOST”'为正确的层,而默认视图为不支持的正确错误信息请求)是笨拙。 – metatoaster

+0

因此,首先从IBeforeTraverseEvent订阅者中添加接口到请求,然后在这些接口上注册视图会有诀窍吗? – Petri

回答

3

通常大多数视图都遵循更新/渲染模式,通常将它放在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() 
4

对于“只邮报”保护您也可以使用plone.protect内部特点:

@protect(PostOnly) 
... 

虽然对于accept头我怕你亩st手动检查请求数据。

相关问题