将云端点API放在单独的应用程序引擎模块中



我正在开发一个应用程序引擎应用程序,并计划还提供一个API。我想将这个API与主站点分离,所以我尝试使用"模块"功能来分离这两个应用程序。主站点将是"默认"模块,API将位于"API"模块中。然而,我在这方面遇到了麻烦。

现在我的主应用程序的YAML文件是这样的:

application: my-app
module: default
runtime: python27
api_version: 1
...
handlers:
# Root handler
- url: /.*
  script: main.app
  secure: always
...

以及API模块的YAML文件,如下所示:

application: my-app
module: api
runtime: python27
api_version: 1
handlers:
# Endpoints handler
- url: /_ah/spi/.*
  script: api_main.app
  secure: always
...

在开发服务器上,应用程序在8000端口提供服务,API在7998端口提供服务。

有了这个配置,我的API就不能工作了。每当我尝试使用localhost:7798/\ah/api/explorer访问它时,都没有得到任何结果。如果我尝试手动运行API请求,我会得到以下错误:{"error": {"message": "BackendService.getApiConfigs Error"}}

奇怪的是,我还在开发服务器日志中看到以下行:

INFO     2014-06-15 18:00:32,368 module.py:639] default: "POST /_ah/spi/BackendService.getApiConfigs HTTP/1.1" 500 -
INFO     2014-06-15 18:00:32,368 module.py:639] api: "GET /_ah/api/my-app/v1/events HTTP/1.1" 500 60

API模块似乎正在尝试将数据POST到默认模块(如日志的第一行所示(。

目前,我找到的唯一解决方法是在默认的YAML文件中为/_ah/spi/.*添加相同的处理程序,但在这种情况下,主应用程序和API之间的分离是无效的。

有人能告诉我,我试图实现的配置是否受云端点的支持吗?非常感谢!

同样的问题,我能够在5月临时之后使其工作:我找到的(唯一(方法是使云内点模块成为默认模块。然后我有:在开发服务器上,两个模块在不同的端口侦听,你可以在日志和xxx.appspot.com上看到prot编号:云端点的是yourprojectid.appspot.com,另一个模块的是modulename-dot-yourprojectid.appspot..com

我也遇到了同样的问题。

我解决了使用一个文件发布API的问题。这个文件显示在app.yaml中。我把我的API放在不同的文件中。


 app.yaml
 apis
    publish_api.py
    teacher
        teacher_api.py
    student
        student_api.py
**app.yaml:**
- url: /_ah/spi/.*
  script: apis.publish_api.api
  secure: always
**publish_api.py:**
import endpoints
from teacher.teacher_api import TeacherApi
from student.student_api import StudentApi
api = endpoints.api_server([TeacherApi, StudentApi])
**teacher_api.py:**
@endpoints.api( name='teacher',
                version='v1',
                allowed_client_ids=[WEB_CLIENT_ID, API_EXPLORER_CLIENT_ID],
                scopes=[EMAIL_SCOPE])
class TeacherApi(remote.Service):
    @endpoints.method(message_types.VoidMessage, StringMessage,
                      path='teacher', http_method='POST', name='writeTeacher')
**student_api.py:**
...

所以,我可以分别处理每个文件。

相关内容

最新更新