Resolver la ruta de descubrimiento en el módulo App Engine

Quiero crear un cliente para los puntos finales de mi nube en Python como se describe en la Documentación .

Quiero comstackr la api desde una VM administrada, para obtener la ruta a la API llamando

modules.get_hostname(module="default") 

Esto funciona bien para el servidor de servidores y puedo crear la ruta completa al punto final de descubrimiento, sin embargo, en el sistema en vivo esto devuelve la url a una versión determinada como:

 20150628t110011.default.guestbook.appspot.com 

Por lo tanto, la ruta completa a la API (módulo predeterminado) sería

 https://20150628t110011.default.guestbook.appspot.com/_ah/api/discovery/v1/apis/guestbook/v1/rest?userIp=182.177.0.4" 

Pero no hay un documento de descubrimiento, tal vez debido al hecho de que el certificado no coincide con una URL tan larga y falla el https.

¿Hay una forma adecuada de recibir la url base para el módulo predeterminado? al igual que:

 default.guestbook.appspot.com 

porque eso daría lugar a un punto final de descubrimiento de trabajo:

 https://default.guestbook.appspot.com/_ah/api/discovery/v1/apis/guestbook/v1/rest?userIp=182.177.0.4" 

Me gustaría evitar realizar operaciones de cadena aquí, porque en el servidor de servidores local esto no funcionaría ya que la url del módulo se resuelve en algo como localhost:1234 .

Probablemente quiera pasar por el documento de enrutamiento de la URL de GAE : https://cloud.google.com/appengine/docs/python/modules/routing#routing_via_url

Puntos clave allí:

  • Google no emite certificados SSL para dominios con doble comodín alojados en appspot.com, el certificado no funcionará para https: // 20150628t110011.default.guestbook .appspot.com
  • Puede hacer que el certificado funcione utilizando los delimitadores -dot- ; en particular, se puede acceder directamente a la versión predeterminada del módulo predeterminado en guestbook.appspot.com

El problema se complica aún más si su aplicación tiene varios módulos y también si se asigna a un dominio personalizado.

Al tratar de abordar tales complicaciones, me di cuenta de que modules.get_hostname () ya no puede realizar la función original que su nombre implica (supongo que debido a las múltiples rutas posibles para acceder a la misma entidad). Lo que probablemente explica por qué no intentarán arreglar la api para devolver un nombre de host adecuado : (consulte estas preguntas y respuestas )

Pero la información que puede devolver (según corresponda según los argumentos de invocación y el contexto de ejecución) es muy útil en mi humilde opinión, lo que permite obtener programáticamente nombres de host / URL adecuados para los 3 posibles contextos de uso de aplicaciones: en el servidor de desarrollo, en el .appspot Dominio .com y en la asignación de dominios personalizados (incluida la asignación basada en el nombre de host):

 ....(appspot.com|:) 

Este sería, por ejemplo, mi enfoque para una aplicación que no esté interesada en nada debajo del nombre del módulo y que use el enrutamiento de despacho de dominio personalizado basado en el nombre de host (módulos asignados a diferentes nombres de host):

 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:]) 

Según este hilo , desafortunadamente, se requiere una conversión manual para convertir desde . nombre de host a -dot- .