Sirviendo la imagen de blobstore a través de los extremos del app-engine api

Estoy construyendo una API api del app-engine que toma la foto de un usuario (aplicación android) y la guarda en blobstore mediante programación. A continuación, guardar la blob_key en mi almacén de datos. El código es el siguiente:

Luego guardo en el blobstore como este:

 from google.appengine.api import files def save_image(data): # Create the file file_name = files.blobstore.create(mime_type='image/png') # Open the file and write to it with files.open(file_name, 'a') as f: f.write('data') # Finalize the file. Do this before attempting to read it. files.finalize(file_name) # Get the file's blob key blob_key = files.blobstore.get_blob_key(file_name) return blob_key # which is then saved to datastore 

Ahora quiero servir la imagen de nuevo. No veo cómo encajar el siguiente código en mis puntos finales api:

 from google.appengine.ext import blobstore from google.appengine.ext.webapp import blobstore_handlers class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): def get(self, resource): resource = str(urllib.unquote(resource)) blob_info = blobstore.BlobInfo.get(resource) self.send_blob(blob_info) 

Al final me imagino un procedimiento de servicio como este:

  • En @ endpoints.method:

  • Obtener blob_key desde el almacén de datos

  • Obtener la imagen con blob_key

  • Agregar imagen a StuffResponseMessage

  • Envíe StuffResponseMessage al front-end (aplicación para Android)

Mi enfoque es porque quiero proteger la privacidad de mis usuarios. ¿Alguna idea sobre cómo hacerlo bien? Mis fragmentos de código son generalmente del tutorial de desarrollador de google .


EDITAR:

No veo cómo pasaría la blob_key desde el almacén de datos al siguiente método para recuperar la imagen:

 from google.appengine.ext import blobstore from google.appengine.ext.webapp import blobstore_handlers class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): def get(self, resource): resource = str(urllib.unquote(resource)) blob_info = blobstore.BlobInfo.get(resource) self.send_blob(blob_info) 

¿Qué hay dentro de los resource , de todos modos?

Creo que el resource es el objeto BlobKey de lo que desea servir, como una cadena, retirada de url path. Si observa el origen de google.appengine.ext.blobstore.BlobInfo el método get utiliza una función __normalize_and_convert_keys que toma un argumento del objeto BlobKey OR string.

Si el blob es una imagen, tal vez sea mejor enviar la URL de servicio a su aplicación de Android, en StuffResponseMessage tal vez en su caso. De Google Serving a Blob doc:

Si está sirviendo imágenes, un método más eficiente y potencialmente menos costoso es usar get_serving_url usando la API de imágenes de App Engine en lugar de send_blob. La función get_serving_url le permite publicar la imagen directamente, sin tener que pasar por las instancias de App Engine.

Así que después de guardar la imagen, tome la blob_key devuelta (como por su método save_image(data) arriba) para hacer una url de servicio, luego en su aplicación para Android obtenga la imagen de la URL devuelta. Eso por supuesto significa exponer la url de la imagen sin la protección de la aislamiento.

Si desea hacerlo con protección, utilice la clase BlobReader para leer el blob con el archivo como interfaz. No puede utilizar el método / clase de Servir un ejemplo de Blob porque lo hace en una subclase remote.Service lugar de un manejador.

  • Google Cloud Endpoints Cliente Android: error de autenticación
  • Función User.getUserId () en el punto final de nube api devuelve null para un objeto de usuario que no es nulo
  • Uso de la versión personalizada de la aplicación de App Engine en Android
  • Configurar el proxy TLS para las API de Google Cloud Endpoint
  • "Id no puede ser cero" - GoogleJsonResponseException 400 Petición incorrecta
  • Cómo probar la unidad Google Cloud Endpoints Java Uso de Android Studio 0.8
  • Google Cloud Endpoints EOFException
  • No se puede importar la clase de biblioteca de cliente de nodos de nube de google en el proyecto de Android
  • Uso de la biblioteca cliente desde los puntos finales de Cloud. Jar importación no funciona
  • Google App Engine con Android: prueba de puntos finales en dispositivos reales
  • Nodos de la nube de Appengine generación de cliente que no genera el archivo jar de origen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.