2010-03-31 24 views
2

Je travaille sur une application cherrypy + guépard et souhaite améliorer l'expérience de développement.Cheetah avec CherryPy: comment charger des modèles de base, et le faire automatiquement sur le changement au cours du développement

J'ai tout fonctionne manuellement quand je compile des modèles au préalable. (Mise à jour: Voici comment les choses fonctionnent pour la production: précompiler, ne pas expédier * .tmpl et charger les modèles comme des modules python réguliers.) Cependant, au cours du développement, je préfère simplement charger les modèles chaque fois qu'ils sont référencés. pas besoin de tuer et de redémarrer mon application. J'ai quelques problèmes auxquels je suis confronté:

  1. Si j'ai des modèles héritant de modèles de base, j'obtiens des erreurs d'importation (impossible de trouver des modèles de base). Je pense que cela a fonctionné pendant mes expériences, mais malheureusement je ne l'ai pas sauvé et maintenant je ne peux pas le faire fonctionner.
  2. Supposons que je reçois 1. travail, comment les faire en sorte que les modifications même dans les modèles de base sont repris sans redémarrage.

Ci-dessous mon exemple d'application qui devrait démontrer les problèmes. La structure du répertoire est la suivante:

t.py 
templates/ 
    base.tmpl 
    index.tmpl 

t.py:

import sys 

import cherrypy 
from Cheetah.Template import Template 

class T: 
    def __init__(self, foo): 
     self.foo = foo 

    @cherrypy.expose 
    def index(self): 
     return Template(file='templates/index.tmpl', 
         searchList=[{'foo': self.foo}]).respond() 

cherrypy.quickstart(T(sys.argv[1])) 

base.tmpl:

#def body 
This is the body from the base 
#end def 

This is the base doc 

index.tmpl:

#from templates.base import base 
#extends base 
#def body 
$base.body(self) 
This is the extended body 
#end def 

This is from index 

Exécuter comme ceci:

python t.py Something 

Répondre

1

On dirait que cette question était une sorte de réponse dans une autre question SO. En utilisant la fonction cheetah_import, je peux écrire mes méthodes comme ceci:

@cherrypy.expose 
def index(self): 
    templates = cheetah_import('templates.index') 
    t = getattr(getattr(templates, 'index'), 'index')(searchList=[{'foo': self.foo}]) 
    return t.respond() 

Je vais aussi avoir besoin d'ajouter un __init__.py dans le répertoire des modèles. Cette approche nécessite également que le paramètre engine.autoreload_on de Cherrypy soit défini sur True.

Pour rendre la production plus efficace, je peux faire cheetah_import = __import__ et ne pas remplacer le __builtin__.import par défaut.

1

Essayez ceci:

Remplacer base.tmpl avec:

#from Cheetah.Template import Template 
#def body 
    #set $base = Template(file="templates/base.tmpl") 
    $base.body() 
    <br/> 
This is the extended body 
#end def 

$body() 
<br/> 
This is from index 
+0

Cela fonctionne pour le développement, mais des ruptures dans la production. Pour la production, les modèles sont précompilés et utilisés en les important en tant que modules Python standard. Il n'y aura pas de fichiers * .tmpl en production. –