2014-11-04 6 views
5

Napisałem klasę widoku, która ma wiele widoków @ view_config z predykatami ustawionymi dla pojedynczej trasy. Następnie mam podklasę, która nadpisuje kilka podfunkcji, co wpływa na sposób, w jaki widok jest tworzony. Poniżej jest coś podobnego, ale z uproszczonym kodem.Dziedziczenie klasy widoku piramidy z widokami @view_defaults i @view_config

Podczas odwiedzania view_a route wszystko działa poprawnie. Podczas odwiedzania trasy view_b pokazuje "404 Not Found" Nie można znaleźć zasobu ".

Wygląda na to, że @view_configs nie są "dziedziczone" i połączone z nowym @view_default. Czy istnieje prosty sposób, aby to naprawić, czy muszę przełączyć się na ręczne wykonanie 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' 

Odpowiedz

7

@view_config jest venusian dekorator, a nie ściśle tradycyjny dekorator. Dopiero po wywołaniu .scan() cokolwiek zacznie obowiązywać.

Oznacza to również, że nie są one dziedziczone, jednak venusian zapewnia dekorator klasy o nazwie lift(), który zrobi dokładnie to, co chcesz.

venusianAPI dokumentacja pokazuje, że coś takiego jak poniżej powinny pracować dla przypadku użycia:

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' 

W tym momencie wszystkie odziedziczone funkcje będą prawidłowo mają @view_config stosowane. Teraz po uruchomieniu .scan() aplikacja będzie działać zgodnie z oczekiwaniami.


Należy pamiętać, że dziedziczenie @view_defaults może się zmienić w przyszłości: https://github.com/Pylons/pyramid/issues/1382.

Może to, ale nie musi, zmienić twoje poglądy na liście, w zależności od tego, czy spodziewasz się, że mechanizm renderujący przeniesie się z super klasy.

+0

Człowieku, jak to nie ma więcej głosów. Jeszcze jeden, przynajmniej :) –

Powiązane problemy