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í:
20150628t110011.default.guestbook
.appspot.com -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-
.