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

时间:2016-10-19 08:12:21

标签: python google-app-engine wsgi endpoint

我实施了端点项目:

@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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

由于端点项目包含大量自动生成的代码,因此更改起来比较困难,因此我将其保留为默认代码并修改wsgi-jinja代码,例如通过前缀 - 用/www来表达它。为此,需要相应地修改wsgi-jinja的内部路由:

  • / - &gt; /www
  • /tasks/wipe-ds - &gt; /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