是否可以在同一个应用程序引擎项目中托管端点和 WSGIApplication 应用程序

Is it possible to host endpoint and WSGIApplication application in the same app engine project

我实施了端点项目:

@endpoints.api(name='froom', version='v1', description='froom API')
class FRoomApi(remote.Service):   
    @endpoints.method(FbPutRoomRequest, RoomMessage, path='putroom/{id}', http_method='PUT', name='putroom')
    def put_room(self, request):
        entity = FRoom().put_room(request, request.id)
        return entity.to_request_message()

application = endpoints.api_server([FRoomApi],restricted=False)

app.yaml

- url: /_ah/spi/.*
  script: froomMain.application 

- url: .*
  static_files: index.html
  upload: index.html

我有单独的 wsgi-jinja 项目:

routes = [
    Route(r'/', handler='handlers.PageHandler:root', name='pages-root'),
    # Wipe DS
    Route(r'/tasks/wipe-ds', handler='handlers.WipeDSHandler', name='wipe-ds'),
    ]
config = {
    'webapp2_extras.sessions': {
        'secret_key': 'someKey'
    },
    'webapp2_extras.jinja2': {
        'filters': {
            'do_pprint': do_pprint,
            },
        },
    }
application = webapp2.WSGIApplication(routes, debug=DEBUG, config=config)

app.yaml

- url: /.*
  script: froomMain.application

是否可以在同一个应用程序中托管这两个项目

需要解决的基本问题是定义适当的整体应用请求命名空间,以便可以可靠地路由到适当的子应用,请记住:

  • 只能将一个子应用程序指定为默认子应用程序(它将处理与任何其他子应用程序命名空间不匹配的请求)。
  • 所有非默认子应用程序的命名空间必须先检查默认子应用程序的命名空间
  • 路由到一个子应用程序的决定是最终决定,如果它无法处理请求,它将 return 一个 404,没有回退到另一个可能能够处理的子应用程序请求

在您的情况下,复杂性是由子应用程序的命名空间冲突引起的。例如,来自 wsgi-jinja 项目的 //tasks/wipe-ds 路径都与端点项目中的 .* 命名空间发生冲突。要使其工作,必须修改子应用程序命名空间之一。

由于端点项目包含大量自动生成的代码,因此更难更改,因此我将其保留为默认代码并修改 wsgi-jinja 代码,例如在其前面添加 /www。为此,需要相应地修改 wsgi-jinja 的内部路由:

  • / -> /www
  • /tasks/wipe-ds -> /www/tasks/wipe-ds

您现有的两个项目似乎都有一个 froomMain.py 文件,其中包含 application 全局文件,存在冲突。我会重命名 wsgi-jinja 的,假设为 www.py:

routes = [
    Route(r'/www/', handler='handlers.PageHandler:root', name='pages-root'),
    # Wipe DS
    Route(r'/www/tasks/wipe-ds', handler='handlers.WipeDSHandler', name='wipe-ds'),
    ]
config = {
    'webapp2_extras.sessions': {
        'secret_key': 'someKey'
    },
    'webapp2_extras.jinja2': {
        'filters': {
            'do_pprint': do_pprint,
            },
        },
    }
application = webapp2.WSGIApplication(routes, debug=DEBUG, config=config)

您的 app.yaml 文件将是:

- url: /www/.*
  script: www.application

- url: /_ah/spi/.*
  script: froomMain.application 

- url: .*
  static_files: index.html
  upload: index.html