2013-02-06 55 views
1

所以我有一個金字塔遍歷應用程序,我希望能夠放棄不存在的URI。有沒有辦法在視圖配置中做到這一點?金字塔遍歷HTTP PUT到不存在的URI

所以,比如我有這個

@view_defaults(context=models.Groups, renderer='json') 
@view_config(request_method='GET') 
class GroupsView(object): 

    def __call__(self): 
     ''' This URI corresponds to GET /groups ''' 
     pass 

    @view_config(request_method='PUT') 
    def put(self): 
     ''' This URI should correspond to PUT /groups/doesnotexist ''' 
     pass 

當然看跌不起作用。上下文在doesnotexist上拋出一個鍵錯誤,但是如何在這種情況下讓移動器匹配視圖?

回答

1

這聽起來像是Group對象的單獨類,其中Group上下文和UndefinedGroup上下文。大多數視圖可以在Group上工作,但是您可以使用特殊方法響應UndefinedGroup對象的PUT請求。請注意,UndefinedGroup不應繼承Group。然後

@view_defaults(context=Group, renderer='json') 
class GroupView(object): 
    def __init__(self, request): 
     self.request = request 

    @view_config(request_method='GET') 
    def get(self): 
     # return information about the group 

    @view_config(context=UndefinedGroup, request_method='PUT') 
    def put_new(self): 
     # create a Group from the UndefinedGroup 

    @view_config(request_method='PUT') 
    def put_overwrite(self): 
     # overwrite the old group with a new one 

你遍歷樹將負責創建UndefinedGroup對象,如果不能找到一個Group

+0

好吧,這是有道理的。我希望不必定義一個額外的類。 – Falmarri

+0

你可以避免定義額外的類,但是你的GET/POST/etc方法將不得不考慮'Group'對象的兩個狀態..一個是真實的,一個是未定義的。這樣你就沒有對'UndefinedGroup'的看法,那些URL將會是404。 –

0

我的視圖類不存養錯誤或GET方法(金字塔版本:1.4.1):

@view_defaults(context='.Group', renderer='json') 
@view_config(request_method='GET') 
class GroupView(object): 
    def __init__(self, context, request): 
     self.context = context 
     self.request = request 

    def __call__(self): 
     return {'method':'GET'} 

    @view_config(request_method='POST') 
    def post(self): 
     return {'method':'POST'} 

    @view_config(request_method='PUT') 
    def put(self): 
     return {'method':'PUT'} 

    @view_config(request_method='DELETE') 
    def delete(self): 
     return {'method':'DELETE'} 

也許__parent____name__屬性有問題。順便說一句,我更喜歡用Configurator method綁定視圖功能:

config.add_view('app.views.GroupView', context='app.resources.Group', 
       request_method='GET', renderer='json') # attr=__call__ 
config.add_view('app.views.GroupView', context='app.resources.Group', 
       attr='put', request_method='PUT', renderer='json') 

使用必要的配置,沒有多餘的類,但爭論。你也可以結合view_defaults裝飾器和Configurator.add_view()方法。

+0

這不是真正的答案。這不適用於金字塔的遍歷模式。 – Falmarri