2010-02-01 15 views
2

J'utilise le framework webapp de google pour cela. J'utilise template.render() dans une méthode get pour rendre un template pour moi.template.render() Google App Engine (python)

J'utilise le code suivant pour le faire pour moi

path = os.path.join(os.path.dirname(__file__), file_name) 
self.response.out.write(template.render(path, template_values)) 

Où nom_fichier est le modèle à rendre et template_values ​​est un dict() contenant toutes les valeurs à rendre. Que faire si je n'ai aucune valeur que je veux rendre. Est-ce que je viens de passer dans un objet vide dict()? Cela ne me semble pas être une excellente solution. Dois-je utiliser template.load() à la place?

(je ne peux pas trouver les documents pour la classe de modèle sur le Google App Engine soit, donc je demande.)

+1

Etes-vous sûr que template_values ​​n'est pas facultatif? Je n'ai pas appengine installé sur cette boîte, mais je pensais que je me souviens de ne pas avoir besoin de le fournir. Cependant, votre question pose une autre question. Si vous ne transmettez aucune valeur de modèle, pourquoi utilisez-vous un modèle? –

+0

@Mike Probablement parce que je suis si nouveau à la GAE. Je veux (pour l'insance) l'url http: // localhost: 8080/foobar pour rendre le modèle pour moi, je ne veux pas que les utilisateurs accèdent à http: // locahost: 8080/templates/foobar.html. De cette façon, lorsque les utilisateurs reviendront sur/foobar, je traiterai leurs entrées et rendrai le modèle en conséquence. Peut-être que j'aboie le mauvais arbre? – Phil

+0

@moderators - est-ce correct de commencer un nouveau sujet et de poser une question qui n'est pas la même mais très similaire? – Phil

Répondre

4

Ok, merci pour toutes les réponses.

Ce que je l'ai fait est:

def render_template(template_name, template_values=dict()): 
    path = os.path.join(os.path.dirname(__file__), template_name) 
    self.response.out.write(template.render(path, template_values)) 

qui semble être la solution la plus pythonique je pouvais trouver.

+0

Merci pour le partage. Agréable et propre. – Bill

1

Puisque vous êtes rendu d'un modèle Django, vous devez utiliser rendu, et vous ne peut probablement pas fournir un dictionnaire vide, car il se plaindra de ne pas pouvoir trouver les variables attendues, à moins que vous ne placiez chaque référence de variable dans un bloc {% if%}. Vous devez fournir un dictionnaire avec toutes les clés attendues par le modèle mais avec des chaînes vides en tant que valeurs.

+0

Je ne pense pas que je l'explique correctement, bien que les fichiers statiques ressemblent à ce que je veux faire. Fondamentalement, j'ai un modèle foo.html qui contient un formulaire. Lorsque le formulaire est publié, je veux traiter les entrées et re-rendre la page (foo.html) en fonction de ces entrées. Mais lorsque l'utilisation navigue simplement vers le formulaire, je ne veux pas afficher de valeurs dans le formulaire. Si je ne sers que le fichier html statique, il contient toutes mes balises {{}}, je ne veux pas non plus devoir répliquer le fichier html. – Phil

+0

Phil, ce que vous décrivez nécessite que vous utilisiez le modèle.render avec un dictionnaire template_values ​​vide. –

+0

@Adam C'est ce que je suis en train de faire (selon mon article original). Je demande s'il y a une meilleure solution que celle-ci. – Phil

5

Vous pouvez lui passer un dictionnaire vide et cela ne vous dérange pas. Vous devez juste lui envoyer quelque chose. Vos modèles n'afficheront rien.

template_values = {} 

path = os.path.join(os.path.dirname(__file__), file_name) 
self.response.out.write(template.render(path, template_values)) 
+0

Pourriez-vous remplacer template_values ​​par '{}'? Je sais que 'dict()' fonctionnerait, mais je suis incapable de tester le premier paramètre actuellement. – jmlane

1

Si vous n'avez pas de variables de modèle à transmettre, transmettez simplement un dictionnaire vide. Si vous utilisez des variables dans le modèle, elles seront toutes évaluées comme Aucune.

Pour vous faciliter la tâche, vous pouvez modifier votre code d'assistance:

def render_template(template_name, template_values = None): 
    if template_values is None: 
    template_values = {} 
    path = os.path.join(os.path.dirname(__file__), template_name) 
    self.response.out.write(template.render(path, template_values))