在gaepython中创建一个类方法“Template”

2024-09-24 22:17:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python还是个新手,不到一年的经验,我一直在通过在googleappengine上构建一个相当大的项目来学习它。它已经成长为一个由10k多行代码和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))

我想采用这个样板代码并以某种方式抽象它,也许可以为每个类方法添加一个“可定制”的代码?在

我想我也许可以用一个decorator来做这件事,但是除了stackoverflow之外,我没有python导师来指引我正确的方向。我更喜欢最有可能的Python方法,或者至少在这种情况下通常被认为是“最佳实践”。在

python版本是2.7.2。在

编辑

注意,如果我可以用decorator来实现这一点,那么我需要什么才能从完全不同的类和python文件调用decorator呢?我希望能够将我的修饰符放在一个文件中,并从其他地方引用它,这样我的代码就尽可能地规范化了。=)

编辑2

这是我在控制台中编写的测试代码,我必须晚上离开,否则我会改进它。然而,它似乎成功地访问和修改了类的属性,这正是我认为在GAE中实现这一点所需要的。在

^{2}$

印刷品

10
5
this is test 2
this is test 3

Tags: 代码selfurlgetisrequesthtmlcreate
1条回答
网友
1楼 · 发布于 2024-09-24 22:17:58

您可以为请求处理程序使用基类,而不是使用decorator,如下所示

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!'}

相关问题 更多 >