2012-09-05 13 views
6

Il sito webapp2 (http://webapp-improved.appspot.com/api/webapp2_extras/jinja2.html) ha un tutorial su come utilizzare webapp2_extras.jinja2 e il codice è di seguito.perché decorare istanze Jinja2 con @ webapp2.cached_property

La mia domanda è: perché memorizzare l'istanza della cache webapp2_extras.jinja2.Jinja2 entro il return jinja2.get_jinja2(app=self.app)? Ho controllato il codice @webapp2.cached_property e ho scoperto che memorizza nella cache l'istanza Jinja2 in un'istanza di BaseHandler, che verrà distrutta dopo la richiesta, quindi perché preoccuparsi di memorizzarla nella cache? Mi sono perso qualcosa qui?

 
import webapp2 

from webapp2_extras import jinja2 

class BaseHandler(webapp2.RequestHandler): 

    @webapp2.cached_property 
    def jinja2(self): 
     # Returns a Jinja2 renderer cached in the app registry. 
     return jinja2.get_jinja2(app=self.app) 

    def render_response(self, _template, **context): 
     # Renders a template and writes the result to the response. 
     rv = self.jinja2.render_template(_template, **context) 
     self.response.write(rv) 
+0

Divertente mi hai chiesto ... ho appena dato un'occhiata allo stesso modo e non riesco a capire il punto ... C'è un punto in cached_property, ovviamente, per le cose usate più volte in una richiesta ... – thomasf1

risposta

1

Here è possibile trovare la documentazione su cached_property.

La classe BaseHandler verrà chiamata più tardi. La mia comprensione è che per evitare l'overhead di chiamare ogni volta jinja2.get_jinja2(app=self.app), tale riferimento viene valutato solo la prima volta e quindi restituito molte volte in seguito, ad esempio ogni volta che viene richiamata una vista.

Per vedere ciò accade nel codice, vedere l'esempio this, in cui ogni vista è derivata dalla stessa classe BaseHandler.