【问题标题】:Google App Engine - How do I split code into multiple files? (webapp)Google App Engine - 如何将代码拆分为多个文件? (网络应用)
【发布时间】:2010-12-30 07:59:35
【问题描述】:

我有一个关于拆分 main.py 文件的问题。

现在,我的 main.py 中包含所有内容。我没有其他 .py 文件。而且在到达我想要编辑的部分之前,我总是需要滚动很长的代码行。

如何拆分? (我将有超过 20 页,这意味着如果我不拆分 main.py 将会非常庞大​​。

PS:另外,我注意到我每次都必须设置模板值、模板路径和调用 template.render。有什么方法可以缩短它们吗?

代码:

    # everything here in main.py
class MainPage(webapp.RequestHandler):
    def get(self):
        # Models are queried here, results transferred to template_values

        template_values = {
            'value1': value1,
            'value2': value2,
            'value3': value3,
            }

        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))

class Page2(webapp.RequestHandler):
    def get(self):
        # Models are queried here, results transferred to template_values

        template_values = {
            'value1': value1,
            'value2': value2,
            'value3': value3,
            }

        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))

class Page3(webapp.RequestHandler):
    def get(self):
        # Models are queried here, results transferred to template_values

        template_values = {
            'value1': value1,
            'value2': value2,
            'value3': value3,
            }

        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))


application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/page2', Page2)
                                      ('/page3', Page3)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

【问题讨论】:

  • 移动 http 到新的并保留帖子是我的策略,因为帖子是最关键的并且已经工作了。

标签: python google-app-engine web-applications


【解决方案1】:

拆分代码与拆分任何 Python 应用程序的代码没有什么不同 - 找到一堆要移动到另一个文件的相关代码,将其移动到该文件,然后将其导入到主处理程序文件中。

比如你可以把Page2的代码移到page2.py中,放

import page2

在文件顶部,更改映射以从 page2.Page2 加载 /page2(在这种情况下,您可能需要重命名这些类...

或者,您可以通过编辑app.yaml 文件,如Script Handlers 中所述,让单独的 .py 文件处理不同(组)页面。

您可以将模板处理代码包装在一个方便的函数中并调用它,以稍微减少重复代码。您可能能够简化模板值的加载,但是一旦您想要渲染,您可以调用类似的方法

def render(template_file, template_values):
    path = os.path.join(os.path.dirname(__file__), template_file)
    self.response.out.write(template.render(path, template_values))

节省不多,但更具可读性。可能您想将render 移动到另一个文件,然后将import 移动到您想要的位置。

【讨论】:

    【解决方案2】:

    感谢您的意见,非常感谢他们。

    至于将导入组合在一起,我尝试将所有与应用程序引擎相关的导入保存到一个名为 ext.py 的 .py 文件中

    然后我通过这一行在任何我想使用它的地方调用它:

    from ext import *
    

    ext.py 包含以下内容:

    import os
    
    # import from appengine's libs
    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app
    from google.appengine.ext.webapp import template
    from google.appengine.ext import db
    
    # import models
    from models import *
    

    【讨论】:

    • 我注意到,当我从 main.py 中分离出 Page2 类时,我仍然需要在 page2.py 文件的顶部导入 appengine 库。这有点多余。有什么建议吗?
    • 这可能应该是一个单独的问题,因为我们现在确实在这个问题中打包了很多信息,但是......一个答案是在 ext 中创建反映您的导入的变量。这里的格式会很糟糕,但是像:import google.appengine.ext.webapp; webapp = google.appengine.ext.webapp 然后当你的其他模块导入 ext 时,它们可以引用 ext.webapp(或者使用from ext import 来谈论 webapp)。
    【解决方案3】:

    在其他 .py 文件中定义您的类,并使用“import”在您的 main.py 中使用它们。其实很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多