我想在 python 中为我的云端点构建一个客户端,如 the Documentation 中所述.
我想从托管 VM 构建 API,所以我通过调用获取 API 的路径
modules.get_hostname(module="default")
这适用于开发服务器,我可以创建到发现端点的完整路径,但是在实时系统上,这会将 url 返回到某个版本,例如:
20150628t110011.default.guestbook.appspot.com
因此,API(默认模块)的完整路径将是
https://20150628t110011.default.guestbook.appspot.com/_ah/api/discovery/v1/apis/guestbook/v1/rest?userIp=182.177.0.4"
但是没有发现文档,可能是因为证书没有匹配那么长的url,https失败了。
是否有正确的方法来接收默认模块的基本 url?像这样:
default.guestbook.appspot.com
因为这会产生一个有效的发现端点:
https://default.guestbook.appspot.com/_ah/api/discovery/v1/apis/guestbook/v1/rest?userIp=182.177.0.4"
我想避免在这里进行字符串操作,因为在本地开发服务器上这不会工作,因为模块 url 解析为类似 localhost:1234 的内容。
请您参考如下方法:
您可能想要浏览 GAE URl routing doc : https://cloud.google.com/appengine/docs/python/modules/routing#routing_via_url
关键点:
- Google 不会为双通配符域颁发 SSL 证书 托管在 appspot.com,证书不适用于 https://
20150628t110011.default.guestbook.appspot.com - 您可以使用
-dot-分隔符使证书生效;特别是 default 的 default 版本 模块可以直接访问guestbook.appspot.com
如果您的应用有多个模块并且映射到自定义域,问题会变得更加复杂。
在尝试解决这些并发症时,我意识到 modules.get_hostname()现在不再能够执行其名称所暗示的原始功能(我猜是因为访问同一实体的多个可能路径)。这可能解释了为什么他们不会尝试 fix the api to return a proper hostname :(见此Q&A)
但它可以返回的信息(适用情况取决于调用参数和执行上下文)恕我直言非常有用,允许以编程方式为所有 3 种可能的应用程序使用上下文获取正确的主机名/URL : 在开发服务器上,在 .appspot.com 域和自定义域映射上(包括基于主机名的映射):
<instance_id>.<module_version>.<module_name>.<app_name>.(appspot.com|<devserver_hostname>:<port#>)
例如,对于一个对模块名称下方的任何内容都不感兴趣并使用基于主机名的自定义域调度路由的应用程序,这将是我的方法 - 模块映射到不同的主机名):
def get_module_url(self, module_name='default'):
host_name = modules.get_hostname(module=module_name)
if os.environ.get('SERVER_SOFTWARE').startswith('Development'):
return 'http://' + host_name
app_name = app_identity.get_application_id()
split_name = self.request.host.split(':')[0].split('.')
if split_name[-2] == 'appspot':
new_host_name = app_name if module_name == 'default' else module_name + '-dot-' + app_name
else:
# custom hostname-based domain mapping, default module goes to `www`.mydomain.com
new_host_name = 'www' if module_name == 'default' else module_name
if app_name.endswith('-staging'):
# copy of the GAE app for staging purposes on mydomain.com
new_host_name += '-staging'
return '.'.join(['https://' + new_host_name] + split_name[1:])
