我想在python中为我的云端点构建客户端,如the Documentation中所述。
我想从托管虚拟机构建api,所以我通过调用
获取API的路径modules.get_hostname(module="default")
这适用于devserver,我可以创建发现端点的完整路径,但是在实时系统上,这会将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"
但是没有发现文件,可能是因为证书与长时间的网址不匹配而且https失败。
是否有正确的方法将基本网址接收到默认模块?像这样:
default.guestbook.appspot.com
因为这会产生一个有效的发现端点:
https://default.guestbook.appspot.com/_ah/api/discovery/v1/apis/guestbook/v1/rest?userIp=182.177.0.4"
我想避免在这里进行字符串操作,因为在本地devserver中,这不会起作用,因为模块url会解析为localhost:1234
之类的内容。
答案 0 :(得分:4)
您可能希望浏览GAE URl routing doc:https://cloud.google.com/appengine/docs/python/modules/routing#routing_via_url
关键点:
20150628t110011.default.guestbook
.appspot.com -dot-
分隔符获取证书;特别是默认的默认版本
可以直接在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:])
答案 1 :(得分:2)
根据this thread,很遗憾,需要手动转换才能将.
主机名转换为-dot-
。