2010-05-18 6 views
0

Après juste codé pendant environ 6-9 mois. J'ai probablement changé mon style de codage un certain nombre de fois après avoir lu du code ou lu les meilleures pratiques. Mais une chose que je n'ai pas encore faite est de savoir pourquoi remplir le template_dict.Webapp meilleure pratique template_dict

A partir de maintenant je passe le template_dict à travers un certain nombre de méthodes (qui le modifie/le modifie) et renvoie est. Le résultat est que chaque méthode prend template_dict comme premier argument et le renvoie et cela à mes yeux ne semble pas être la meilleure solution.

Une idée consiste à avoir une méthode qui gère tous les changements. Mais je suis curieux s'il y a une meilleure pratique pour cela? Ou est-ce que c'est "fais ce que tu ressens" -type de chose?

Les 2 choses que je pense est assez moche est d'envoyer comme argument et de le retourner dans toutes les méthodes. Et juste le nom du var est écrit nombre xxx fois dans le code :)

..fredrik

EDIT:

Pour démontrer ce que je veux dire avec template_dict (je pensais que c'était un général terme, je l'ai obtenu à partir de l'implémentation google des méthodes de template de django).

J'ai un dict je passe au modèle via la méthode render.template:

template.render(path, template_dict) #from google.appengine.ext.webapp import template 

Ce template_dict je dois manipuler afin d'envoyer des données/dicts/listes à la vue (fichier html) . Si je ne me trompe pas.

Donc, avec cela à l'esprit, mon code se termine habituellement à la recherche un peu cela comme ceci:

## Main.py file to handle the request and imports classes. 

from models import data 
from util import foo 

class MainHandler(webapp.RequestHandler): 
    template_dict = { 'lang' : 'en' } 
    ## reads all current keys and returns dict w/ new keys, if needed 
    template_dict = data.getData(template_dict) 
    if 'unsorted_list' in template_dict: 
     template_dict = util.foo(template_dict) 
    ## and so on.... 

    path = os.path.join(os.path.dirname(__file__), 'templates', file) 
    self.response.out.write(template.render(path, template_dict)) 

Dans la plupart de mes applications les nombreux retours et ensembles ne figure pas dans la main.py mais plutôt autres classes et méthodes.

Mais vous devriez faire l'idée générale.

+2

Qu'est-ce que 'template_dict'? Vous en parlez comme s'il s'agissait d'une partie bien connue de Django, mais je n'en ai jamais entendu parler ou je ne l'ai jamais utilisé. Montrez du code qui démontre ce qu'il fait. –

+1

Je suppose qu'il fait référence au dictionnaire que vous passez à un modèle dans la méthode render_to_response ... mais je ne peux pas imaginer pourquoi vous devriez le passer à plusieurs méthodes. Je suis d'accord, l'échantillon de code nécessaire. –

+0

@Daniel et Chris: Je vais mettre à jour avec du code pour montrer ce que je veux dire. – fredrik

Répondre

1

Si les fonctions en question sont toutes les méthodes d'un objet foo, alors chacune d'elles peut se référer au contexte qu'elles construisent (j'imagine que c'est ce que tu veux dire par "template dict"?) Comme self.ctx ou similaire (nom d'attribut est quelque peu arbitraire, le point clé est que vous pouvez garder le contexte comme un attribut de foo, généralement initialisé à vide dans foo__init__, et le construire progressivement par l'intermédiaire des méthodes de foo, à la fin, foo.ctx est prêt pour toi).

Cela ne fonctionne pas dans un cas plus général où les fonctions sont partout plutôt que d'être des méthodes d'un seul objet. Dans ce cas, ctx doit être passé à chaque fonction (bien que la fonction puisse généralement la modifier sur place et n'a pas besoin de la renvoyer).

+0

Désolé pour le premier message (un peu déroutant). C'est mis à jour – fredrik

+0

@fredrik, bien sûr: c'est ce qu'on appelle normalement un contexte, comme je l'ai imaginé (et c'est pourquoi j'ai utilisé le nom d'attribut 'ctx' ;-). Comme je l'ai déjà mentionné, juste à la fin de ma réponse ci-dessus: il suffit que toutes ces fonctions modifient le dict (contexte AKA) en place; vous le passerez toujours en tant qu'argument (la seule pratique saine si les fonctions ne sont pas des méthodes d'un seul argument), mais vous n'aurez pas toutes les assignations de templateplat = '' template_dict = ''. –

+0

Ah m'a pris 2-3 lectures pour comprendre ce que tu voulais dire. Merci. – fredrik

Questions connexes