解决App Engine模块上的发现路径

时间:2015-06-30 14:35:49

标签: python google-app-engine google-cloud-endpoints

我想在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之类的内容。

2 个答案:

答案 0 :(得分:4)

您可能希望浏览GAE URl routing dochttps://cloud.google.com/appengine/docs/python/modules/routing#routing_via_url

关键点:

  • Google不会为双通配符域颁发SSL证书 在appspot.com上托管,该证书不适用于https:// 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-