2012-01-11 3 views
0

Я по-прежнему новичок в python с менее чем за год опыта, и я изучал его, создав довольно большой проект в Google App Engine. Он вырос как behemoth из 10k + строк кода и html-шаблонов, поэтому я занимаюсь реорганизацией довольно большой части кода, чтобы следовать гораздо более строгой архитектуре MVC.Сделать метод класса «Шаблон» в GAE Python

Мой вопрос один относительно python напрямую. Я не знаю слов, чтобы точно сказать, что я хочу построить, поэтому просто хотел бы использовать пример.

Это мой текущий «базовый» код для отображения вида:

class MainHandler(webapp.RequestHandler): 
    def get(self): 
     tUser = users.get_current_user() 
     tContext = { 
      'user':  tUser, 
      'login':  users.create_login_url(self.request.uri), 
      'logout': users.create_logout_url(self.request.uri), 
     } 

     #User is logged in 
     if (tUser): 
      #code for loading view information and adding to the context dict 
      #CUSTOMIZATION GOES HERE 
     else: 
      self.redirect("/") 

     tmpl = os.path.join(os.path.dirname(__file__), 'logged-in.html') 
     self.response.out.write(render(tmpl, tContext)) 

Я хотел бы принять этот шаблонный код и абстрактно это как-то, может быть, с пути Предварением/Добавляя «настраиваемую «код для каждого метода класса?

Я думаю, что смогу использовать декоратор, чтобы сделать это как-то, но у меня нет наставников python вне stackoverflow, чтобы указать мне в правильном направлении. Я предпочел бы самый пифонический метод, или, по крайней мере, то, что обычно считается «передовой практикой» в этой ситуации.

Версия для python - 2.7.2.

редактировать

Обратите внимание, если я могу сделать это с помощью декораторов, то, что нужно для меня, чтобы быть в состоянии назвать декоратор из совершенно другого класса и питона файл? Я бы хотел, чтобы мои декораторы были в одном файле и ссылались на него из другого места, поэтому мой код нормализуется, насколько это разумно. =)

редактировать 2

Это тестирование кода, который я разработал в консоли, и я должен оставить на вечер, или я бы уточнить его больше. Тем не менее, похоже, что это успешно обращается и изменяет свойства класса, что в значительной степени является тем, что, как мне кажется, вам нужно сделать в GAE.

class Decorators(): 
@staticmethod 
def BeginInit(pInFunction): 
    def OutFunction1(self): 
     print str(self.innerv) 
     pInFunction(self) 
    return OutFunction1 

@staticmethod 
def EndInit(pInFunction): 
    def OutFunction2(self): 
     self.innerv = 5 
     pInFunction(self) 
     print "this is test 3" 
    return OutFunction2 

class Test2Handler(): 
    innerv = 10 
    @Decorators.BeginInit 
    @Decorators.EndInit 
    def TestPrint(self): 
     print self.innerv 
     print "this is test 2" 

Печать

10 
5 
this is test 2 
this is test 3 

ответ

1

Вместо использования декораторов, вы могли бы использовать базовый класс для обработчиков запросов, как и

class HandlerBase(webapp.RequestHandler): 

    def get_context(self): 
     return {} 

    def get(self): 
     tUser = users.get_current_user() 
     tContext = { 
      'user':  tUser, 
      'login':  users.create_login_url(self.request.uri), 
      'logout': users.create_logout_url(self.request.uri), 
     } 
     # tContext holds the defaults for your context 

     #User is logged in 
     if (tUser): 
      # if the dict returned by self.get_context() contains a key 
      # that's already in tContext, tContext[key] will be overridden 
      # with self.get_context()[key] 
      tContext.update(self.get_context()) 
     else: 
      self.redirect("/") 

     tmpl = os.path.join(os.path.dirname(__file__), 'logged-in.html') 
     self.response.out.write(render(tmpl, tContext)) 


class MainHandler(HandlerBase): 

    def get_context(self): 
     # the contents of the following dict will be added to 
     # the context in HandlerBase 
     return {'greeting': 'Hi!'} 
+0

Интересно, да это также будет работать. знак равно –

Смежные вопросы