Google App Engine - 如何将代码拆分成多个文件?(webapp)

16 投票
3 回答
6830 浏览
提问于 2025-04-15 17:24

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

现在,我所有的代码都在 main.py 里,没有其他的 .py 文件。每次我想编辑某个部分时,都得不停地滚动很长的代码行,才能找到我想改的地方。

我该怎么把它拆分开呢? (我将会有超过 20 页的代码,如果不拆分,main.py 会变得非常庞大。)

另外,我还注意到每次都得设置模板的值、模板路径,并调用 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()

3 个回答

0

谢谢你的建议,我真的很感激。

关于把导入的内容放在一起,我尝试把所有与应用引擎相关的导入放在一个叫做 ext.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 *
3

把你的类定义在其他的 .py 文件里,然后在你的 main.py 文件中用 "import" 来引入它们。其实这非常简单。

22

把代码拆分开来和拆分任何Python应用的代码没什么不同。你只需要找到一堆相关的代码,想把它们移到另一个文件里,然后把这个文件导入到主处理文件中。

举个例子,你可以把Page2的代码移到一个叫page2.py的文件里,然后在文件顶部加上

import page2

接着把你的映射改成从/page2加载page2.Page2(在这种情况下,你可能还想重命名这些类……)

另外,你也可以通过编辑app.yaml文件来让不同的.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移到另一个文件里,然后在需要的地方导入它。

撰写回答