为子域配置GAE应用的app.yaml

3 投票
2 回答
1079 浏览
提问于 2025-04-16 11:55

我在GAE上有一些子域名,比如说blog.mysite.com、projects.mysite.com和docs.mysite.com。现在的设置是这样的,它们都在main.py里处理:

def main():
    applications = {
        'blog.mysite.com': webapp.WSGIApplication([('/', BlogHandler)]),
        'projects.mysite.com': webapp.WSGIApplication([('/', ProjectsHandler)]),
        'docs.mysite.com': webapp.WSGIApplication([('/', DocsHandler)]),
    }
    util.run_wsgi_app(applications[os.environ['HTTP_HOST']])

我该怎么做才能把这些子应用分开,让它们分别由不同的模块处理呢?我想要的效果是有blog.pyprojects.pydocs.py这样的文件。谢谢!

2 个回答

1

最简单的方法可能就是导入合适的模块,然后调用它的 main() 函数,把所有的 WSGI 应用创建放在单独的模块里,而不是在 main.py 里。(我自己的微框架就是在 WSGI 应用内部处理所有的路由,这样做有点乱,甚至让我开始考虑是不是应该放弃这种扩展的 webapp 风格的路由方式。)

你提到的标题里有 app.yaml;你需要把所有请求配置到 main.py,然后在那儿进行分发,因为现在的运行环境根本不允许你在 app.yaml 里做主机映射(不过有一个 公开的问题在请求这个功能,你可以给它点个星)。这不幸的是意味着你只能选择不使用静态处理程序,或者在所有子域名上使用相同的静态内容 URL。

8

这不是直接回答你问题的内容,但你可以看看webapp2。它是一个可以直接替代谷歌的webapp的工具,增加了一些非常实用的功能,其中包括一个新的路由系统,可以根据域名进行路由。

你可以查看routes.py文件,里面有一些示例。你可能会需要用到DomainRoute

    SUBDOMAIN_RE = '^([^.]+)\.app-id\.appspot\.com$'

    app = WSGIApplication([
        DomainRoute(SUBDOMAIN_RE, [
            Route('/foo', 'FooHandler', 'subdomain-thing'),
        ]),
        Route('/bar', 'BarHandler', 'normal-thing'),
    ])

Nick Johnson曾经写过一篇关于webapp2的博客文章

撰写回答