2011-02-25 3 views
3

Une partie de l'application que je suis le codage est structuré à peu près comme ceci:logique de validation dans Google App Engine

class PostModel(db.Model): 
    some_property = db.WhateverProperty() 
    some_other_property = db.WhateverProperty() 

class PostHandler(webapp.RequestHandler): 
    def get(self): 
     #code to generate form 
    def post(self): 
     #code to validate input from form 
     #create entity and put() it to datastore if input passes the validation 

Maintenant, d'après ce que je lis à propos de MVC, cette logique de validation doit être dans le modèle, non? Alors, devrais-je faire quelque chose comme ça à la place?

class PostModel(db.Model): 
    some_property = db.WhateverProperty() 
    some_other_property = db.WhateverProperty() 
    @staticmethod 
    def validation_logic(form_input): 
     #throw exceptions if validation fails 
    @staticmethod 
    def save_to_datastore(form_input): 
     #this would assume data already passed validation 
     #create entity and save it 

class PostHandler(webapp.RequestHandler): 
    def get(self): 
     #code to generate form 
    def post(self): 
     try: 
      PostModel.validation_logic(form_input) 
     except CustomException,e: 
      self.redirect('/errorpage?msg='+e.msg) 
     PostModel.save_to_datastore(form_input) 

Est-ce une bonne forme MVC?

Répondre

3

Il y a plusieurs façons de le faire. Certaines bibliothèques de formulaires feront la plupart des validations de base, mais certaines choses sont inévitablement laissées de côté lorsque vous avez des données plus complexes.

Je pense que c'est une bonne idée de passer un dictionnaire de valeurs à un @classmethod du modèle, et laissez-le valider les données. J'ai habituellement une méthode de classe comme votre save_to_datastore(), essentiellement utilisée pour valider et assembler une entité à enregistrer au lieu de le faire dans le gestionnaire. Je préfère ne pas avoir dans un magasin de données gestionnaire des choses spécifiques. Par exemple: utilisez des méthodes de classe de modèle pour les requêtes au lieu de créer des requêtes directement dans le gestionnaire. Cela vous fait penser que le modèle est une API, qu'il est plus facile à maintenir et qu'il garde une trace des index, etc.