2014-11-04 63 views
5

我已經寫了一個視圖類,它有多個@view_config,其中謂詞爲單個路徑設置。然後我有一個子類覆蓋了一些子函數,這影響了視圖的製作方式。下面是類似的東西,但帶有簡化的代碼。@view_defaults和@view_config裝飾器的金字塔視圖類繼承

當訪問view_a路線時,一切工作正常。當訪問view_b路由時,它顯示「404未找到資源無法找到」。

看起來@view_configs不是'繼承的'並且鏈接到新的@view_default。有沒有簡單的方法來解決這個問題,或者我將不得不切換到手動做config.add_view()

@view_defaults(route_name='view_a', renderer='templates/views.mak') 
class View_A(object): 

    def message(self): 
     return 'This is view a' 

    @view_config(request_method='GET') 
    def get(self): 
     return {'message': self.message()} 

@view_defaults(route_name='view_b') 
class View_B(View_A): 

    def message(self): 
     return 'This is view b' 

回答

7

@view_configvenusian裝飾,而不是一個嚴格的傳統裝飾。直到調用.scan()纔會生效。

這也意味着它們不會被繼承,但是venusian提供了一個名爲lift()的類裝飾器,它將按照您的意願完成。

venusianAPI文件顯示,類似於下面的東西應該爲您的使用情況下工作:

from venusian import lift 

@view_defaults(route_name='view_a', renderer='templates/views.mak') 
class View_A(object): 

    def message(self): 
     return 'This is view a' 

    @view_config(request_method='GET') 
    def get(self): 
     return {'message': self.message()} 

@view_defaults(route_name='view_b') 
@lift() 
class View_B(View_A): 

    def message(self): 
     return 'This is view b' 

此時你的所有繼承的功能,將正確應用了@view_config。現在運行.scan()您的應用程序將按預期運行。


請注意,所述@view_defaults繼承可能在將來改變:https://github.com/Pylons/pyramid/issues/1382

這可能會也可能不會改變您列出的視圖,具體取決於您是否期望渲染器從超類繼承。

+0

男人,這是怎麼沒有更多的選票。多一個,至少:) – 2015-06-12 11:25:49