我正在开发一个应用程序引擎应用程序,并计划还提供一个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:**
...
所以,我可以分别处理每个文件。