2014-11-04 4 views
5

Ich habe eine View-Klasse geschrieben, die mehrere @ view_configs mit Prädikaten für eine einzelne Route festgelegt hat. Ich habe dann eine Unterklasse, die ein paar der Unterfunktionen überschreibt, was sich darauf auswirkt, wie die Ansicht gemacht wird. Unten ist etwas Ähnliches, aber mit vereinfachtem Code.Pyramid View Klassenvererbung mit @view_defaults und @view_config Dekoratoren

Beim Besuch der Route view_a funktioniert alles einwandfrei. Wenn Sie die Route "view_b" aufrufen, wird "404 Not Found (Nicht gefunden) angezeigt. Die Ressource konnte nicht gefunden werden".

Es scheint, dass die @view_configs nicht "geerbt" und mit dem neuen @view_default verknüpft sind. Gibt es eine einfache Möglichkeit, dies zu beheben, oder muss ich manuell zu config.add_view() wechseln?

@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' 

Antwort

7

@view_config ist ein venusian Dekorateur, und nicht um einen streng traditionellen Dekorateur. Erst wenn .scan() aufgerufen wird, wird etwas wirksam.

Dies bedeutet auch, dass sie nicht vererbt werden, aber venusian bietet eine Klasse Dekorateur namens lift(), die genau so tun, wie Sie es wünschen.

Die venusianAPI Dokumentation zeigt, dass so etwas wie die folgenden sollten für Ihren Anwendungsfall arbeiten:

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' 

An dieser Stelle alle geerbten Funktionen wird die @view_config richtig angewendet haben. Nach dem Ausführen von .scan() verhält sich Ihre Anwendung wie erwartet.


Sie zur Kenntnis, dass das Erbe von @view_defaults in Zukunft ändern: https://github.com/Pylons/pyramid/issues/1382.

Dies kann Ihre Ansichten wie aufgelistet ändern oder nicht, je nachdem, ob Sie erwarten, dass der Renderer von der Superklasse übernommen wird.

+0

Mann, wie hat das nicht mehr Stimmen. Hab noch einen mehr :) –