Google App Engine 模块:关于路由(dispatch.yaml)困惑

2 投票
1 回答
2712 浏览
提问于 2025-04-18 09:08

经过深入研究这个问题,似乎问题不在于路由,而是模块中端点的使用。新问题在 GAE模块和Google端点

我正在将一个GAE应用程序迁移到模块中,但我对路由感到困惑,因为有些查询能够正确路由,但并不是所有的查询都能。

我在根文件夹中有一个dispatch.yaml文件。请注意,api模块使用的是Google Cloud Endpoints API。

application: testapp

dispatch:
  - url: "*/foo/*"
    module: foomodule
  - url: "*/_ah/spi/*"
    module: api
  - url: "testapp.appspot.com/"
    module: default

然后每个模块名都有一个文件夹,每个文件夹里都有一个yaml文件,定义了URL模式和处理程序,比如我的默认模块的/www/www.yaml。

application: testapp
version: alpha
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /static
  static_dir: static
- url: /.*
  script: www.app

libraries:
- name: webapp2
  version: latest

像这样的查询 http://testapp.appspot.com/xxx 能够正确重定向到默认模块,而/foo/xxx的请求则由foomodule处理,但API请求(/_ah/spi/xxx)却返回到默认模块,并显示404错误。

不过,我可以在映射到api模块的实例日志中看到/_ah/spi/BackendService.logMessages的200 OK响应。 这个请求来自alpha-dot-api-dot-testapp.appspot.com,而404错误则只来自testapp.appspot.com。(注意:我希望我的查询能够从testapp.appspot.com正常工作)

我是不是做错了什么?另外,有没有办法列出当前服务器上使用的配置,以确保它正确部署了?

1 个回答

2

把接口(api)分离到一个单独的模块里,然后用dispatch.yaml来设置路由,这个想法很吸引人,但在使用dev_appserver.py的时候,似乎做不到这一点。根据这段代码:https://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/devappserver2/dispatcher.py?r=411#704

if (not path.startswith('/_ah/') or
    any(path.startswith(wl) for wl
        in DISPATCH_AH_URL_PATH_PREFIX_WHITELIST)):
  return True
else:
  logging.warning('Skipping dispatch.yaml rules because %s is not a '
                  'dispatchable path.', path)
  return False

任何以 /_ah/ 开头的路径都不能被分发。

撰写回答