2015-06-30 33 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手動檢查請求數據。

相關問題