Сделайте метод класса "Шаблон" в GAE Python - PullRequest
0 голосов
/ 11 января 2012

Я все еще новичок в python с опытом работы менее года, и я изучил его, создав довольно большой проект на движке приложений Google.Он превратился в чудовище из 10 000+ строк кода и HTML-шаблонов, поэтому я нахожусь в процессе рефакторинга довольно большой части кода, чтобы следовать гораздо более строгой архитектуре MVC.

Мой вопрос касается непосредственно 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))

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

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

Версия Python - 2.7.2.

edit

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

edit 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"

Prints

10
5
this is test 2
this is test 3

1 Ответ

1 голос
/ 11 января 2012

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

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!'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...