L'API Blobstore consente alla tua applicazione di gestire oggetti di dati, chiamati blob,molto più grandi delle dimensioni consentite per gli oggetti nel servizio Datastore. I BLOB sono utili per pubblicare file di grandi dimensioni, come file video o immagine, e per consentire agli utenti di caricare file di dati di grandi dimensioni. I blob vengono creati caricando un file tramite una richiesta HTTP. In genere, le tue applicazioni lo fanno presentando un modulo con un campo di caricamento dei file all'utente. Quando il modulo viene inviato, Blobstore crea un blob dai contenuti del file e restituisce un riferimento opaco al blob, chiamato chiave blob,che puoi utilizzare in un secondo momento per pubblicare il blob. L'applicazione può pubblicare il valore blob completo in risposta a una richiesta utente oppure può leggere il valore direttamente utilizzando un'interfaccia di tipo file di streaming.
Ti presentiamo Blobstore
App Engine include il servizio Blobstore, che consente alle applicazioni di gestire
oggetti di dati limitati solo dalla quantità di dati che possono essere caricati o scaricati
tramite una singola connessione HTTP. Questi oggetti sono chiamati valori Blobstore o blob.
I valori di Blobstore vengono forniti come risposte dai gestori delle richieste e vengono creati
come caricamenti tramite moduli web. Le applicazioni non creano direttamente dati blob; i blob vengono creati indirettamente, tramite un modulo web inviato o un'altra richiesta HTTP POST.
I valori di Blobstore possono essere forniti all'utente o accessibili dall'applicazione in un flusso simile a un file utilizzando l'API Blobstore.
Per chiedere a un utente di caricare un valore Blobstore, la tua applicazione presenta un modulo web con un campo di caricamento dei file. L'applicazione genera l'URL di azione del modulo chiamando l'API Blobstore. Il browser dell'utente carica il file direttamente in Blobstore tramite l'URL generato. Blobstore archivia quindi il blob, riscrive la richiesta in modo che contenga la chiave blob e la passa a un percorso nella tua applicazione. Un gestore delle richieste in quel percorso dell'applicazione può eseguire un'ulteriore elaborazione del modulo.
Per pubblicare un blob, la tua applicazione imposta un'intestazione nella risposta in uscita e App Engine sostituisce la risposta con il valore del blob.
I blob non possono essere modificati dopo la creazione, ma possono essere eliminati. A ogni blob corrisponde un record di informazioni sul blob, archiviato nel datastore, che fornisce dettagli sul blob, come l'ora di creazione e il tipo di contenuto. Puoi utilizzare la chiave blob per recuperare i record di informazioni sui blob ed eseguire query sulle relative proprietà.
Un'applicazione può leggere un valore Blobstore una parte alla volta utilizzando una chiamata API.
La dimensione della porzione può raggiungere la dimensione massima di un valore restituito dall'API.
Questa dimensione è leggermente inferiore a 32 megabyte, rappresentati
in Python dalla
costante google.appengine.ext.blobstore.MAX_BLOB_FETCH_SIZE
.
Un'applicazione non può creare o modificare i valori di Blobstore se non tramite file
caricati dall'utente.
Utilizzo di Blobstore
Le applicazioni possono utilizzare Blobstore per accettare file di grandi dimensioni come caricamenti da parte degli utenti
e per pubblicarli. Una volta caricati, i file vengono chiamati blob. Le applicazioni
non accedono direttamente ai blob, invece, le applicazioni funzionano con i blob tramite
entità di informazioni sui blob (rappresentate dalla classe
BlobInfo
) in
Datastore.
L'utente crea un blob inviando un modulo HTML che includa uno o più
campi di immissione file. La tua applicazione
chiamate
blobstore.create_upload_url()
per ottenere
il percorso (l’azione) del modulo dell'applicazione, passando per il percorso
di un URL. Quando l'utente invia il modulo, il browser dell'utente carica i file specificati direttamente in Blobstore. Il
Blobstore riscrive la richiesta dell'utente e archivia i dati del file caricato, sostituendo
i dati del file caricato con una o più chiavi blob corrispondenti, quindi passa la richiesta riscritta al gestore nel percorso dell'URL che hai fornito a
blobstore.create_upload_url()
.
Questo gestore può eseguire un'elaborazione aggiuntiva in base alla chiave del blob.
L'applicazione può leggere porzioni di un valore Blobstore utilizzando un'interfaccia di streaming simile a un file
interfaccia di streaming simile a un file. Visualizza il corso BlobReader.
Caricamento di un blob
Per creare e caricare un blob:
1. Creare un URL di caricamento
Chiama
blobstore.create_upload_url()
per creare un URL di caricamento per il modulo che l'utente compilerà,
passando il percorso dell'applicazione da caricare al termine del POST del modulo.
Esiste una versione asincrona, create_upload_url_async(). Consente al codice dell'applicazione di continuare a essere eseguito mentre Blobstore genera l'URL di caricamento.
2. Creare un modulo di caricamento
Il modulo deve includere un campo di caricamento dei file e il enctype del modulo deve essere impostato su
multipart/form-data. Quando l'utente invia il modulo, POST viene gestito dall'API Blobstore, che crea il blob. L'API crea anche un record di informazioni per il
blob e lo archivia in Datastore, quindi passa la richiesta riscritta alla
tua applicazione nel percorso specificato come chiave blob.
Devi pubblicare la pagina del modulo con un Content-Type di text/html; charset=utf-8,
altrimenti i nomi file con caratteri non ASCII verranno interpretati in modo errato.
Poiché Blobstore per Python 3 non utilizza webapp, devi impostare il tuo
Content-Type per impedire al framework web di impostare un tipo di contenuti predefinito
e ad App Engine di impostarlo su un tipo stimato.
Non puoi utilizzare un bilanciatore del carico delle applicazioni esterno globale con un NEG serverless per gestire le richieste di caricamento inviate all'URL /_ah/upload/ restituito dalla chiamata blobstore.create_upload_url.
Devi invece indirizzare queste richieste di caricamento direttamente al servizio App Engine. Puoi farlo utilizzando il dominio appspot.com o un dominio personalizzato mappato direttamente al servizio App Engine.
3. Implementa il gestore di caricamento
In questo gestore, puoi memorizzare la chiave blob con il resto del modello dei dati dell'applicazione. La chiave blob stessa rimane accessibile dall'entità delle informazioni blob in Datastore. Tieni presente che dopo l'invio del modulo da parte dell'utente e la chiamata del gestore, il blob è già stato salvato e le informazioni sul blob sono state aggiunte al datastore. Se la tua applicazione non vuole conservare il blob, devi eliminarlo immediatamente per impedire che diventi orfano.
Per tutte le app Flask, tutte le chiamate ai metodi nella classeBlobstoreUploadHandler
richiedono request.environ dictionary (la richiesta viene importata dal modulo
Flask). Se la tua app è un'app WSGI senza un framework web, utilizza il parametro
environ nel metodo get_uploads().
Quando riscrive la richiesta dell'utente, Blobstore svuota le parti MIME dei file caricati e aggiunge la chiave blob come intestazione della parte MIME. Blobstore
conserva tutti gli altri campi e le altre parti del modulo, passandoli al gestore di caricamento.
Se non specifichi un tipo di contenuti, Blobstore tenterà di dedurlo dall'estensione del file. Se non riesce a determinare un tipo di contenuti, assegna il tipo di contenuti application/octet-stream al blob appena creato.
Pubblicazione di un blob
Per pubblicare i blob, devi includere un gestore di download dei blob come percorso nella tua applicazione.
L'applicazione pubblica un blob impostando un'intestazione nella risposta in uscita. Se
utilizzi Flask, la
classe BlobstoreDownloadHandler
richiede il dizionario request.environ (la richiesta viene importata dal modulo Flask). Se la tua app è un'app WSGI senza un framework web, utilizzi il parametro environ nei metodi send_blob()
.
I blob possono essere pubblicati da qualsiasi URL dell'applicazione. Per pubblicare un blob nella tua applicazione, inserisci un'intestazione speciale nella risposta contenente la chiave blob. App Engine sostituisce il corpo della risposta con il contenuto del blob.
Intervalli di byte del blob
Blobstore supporta la pubblicazione di una parte di un valore di grandi dimensioni anziché dell'intero valore
in risposta a una richiesta. Per pubblicare un valore parziale, includi l'intestazione X-AppEngine-BlobRange nella risposta in uscita. Il suo valore è un intervallo di byte HTTP standard. La numerazione dei byte è in base zero. Un X-AppEngine-BlobRange vuoto
indica all'API di ignorare l'intestazione dell'intervallo e di pubblicare l'intero blob.
Ecco alcuni esempi di intervalli:
0-499restituisce i primi 500 byte del valore (byte da 0 a 499 inclusi).500-999restituisce 500 byte a partire dal 501° byte.500-mostra tutti i byte a partire dal 501° fino alla fine del valore.-500pubblica gli ultimi 500 byte del valore.
Se l'intervallo di byte è valido per il valore Blobstore, Blobstore invia al client un codice di stato 206 Partial Content e l'intervallo di byte richiesto. Se l'intervallo non è valido per il valore,
Blobstore invia 416 Requested Range Not Satisfiable.
Blobstore non supporta più intervalli di byte in una singola richiesta (ad esempio,
100-199,200-299), indipendentemente dal fatto che si sovrappongano o meno.
Applicazione di esempio completa
Consulta l'esempio di app Flask nella guida API Blobstore per Python 3.
Utilizzo del servizio Images con Blobstore
Il servizio Images può utilizzare un valore Blobstore come origine di una trasformazione. L'immagine sorgente può avere le dimensioni massime per un valore Blobstore. Il servizio Immagini restituisce comunque l'immagine trasformata all'applicazione, pertanto le dimensioni dell'immagine trasformata devono essere inferiori a 32 megabyte. Ciò è utile per creare immagini in miniatura di grandi fotografie caricate dagli utenti. Per informazioni sull'utilizzo del servizio Images con i valori Blobstore, consulta la Documentazione del servizio Immagini.
Utilizzo dell'API Blobstore con Cloud Storage
Puoi utilizzare l'API Blobstore per archiviare i BLOB in Cloud Storage anziché in Blobstore. Devi configurare un bucket come descritto nella documentazione di Cloud Storage e specificare il bucket e il nome file in.
Nel gestore di caricamento, devi elaborare i metadati FileInfo e archiviare esplicitamente il nome file Cloud Storage necessario per recuperare il blob in un secondo momento.
Puoi anche pubblicare oggetti Cloud Storage utilizzando l'API Blobstore.
Se vuoi una soluzione di archiviazione di oggetti più moderna, valuta la possibilità di eseguire la migrazione da Blobstore di App Engine a Cloud Storage.
Utilizzo di BlobReader
Un'applicazione può leggere i dati dai valori Blobstore utilizzando un'interfaccia simile a un oggetto file Python. Questa interfaccia può iniziare a leggere un valore in qualsiasi posizione di byte e utilizza
più chiamate di servizio e buffering, in modo che un'applicazione possa accedere alla dimensione completa
del valore nonostante il limite alla dimensione di una singola risposta alla chiamata di servizio.
La classe BlobReader
può accettare uno dei tre valori come argomento del suo costruttore:
L'oggetto implementa i metodi di file familiari per la lettura del valore. L'applicazione non può modificare il valore Blobstore; i metodi di scrittura dei file non sono implementati.
Effettuare richieste asincrone
Un'applicazione può chiamare alcune funzioni Blobstore che funzionano in background.
Blobstore esegue la richiesta mentre l'applicazione fa altre cose. Per effettuare
la richiesta, l'applicazione chiama una funzione asincrona. La funzione restituisce immediatamente
un oggetto RPC, che rappresenta la richiesta. Quando l'applicazione ha bisogno
del risultato della richiesta, chiama il metodo get_result() dell'oggetto RPC.
Se il servizio non ha completato la richiesta quando l'applicazione chiama get_result(),
il metodo attende il completamento della richiesta (o il raggiungimento della scadenza o il verificarsi di un
errore). Il metodo restituisce l'oggetto risultato o genera un'eccezione se si è verificato un errore durante l'esecuzione della richiesta. Ad esempio, questo snippet di codice
upload_url = blobstore.create_upload_url('/upload')
slow_operation()
self.response.out.write("""<form action="%s" method="POST"
enctype="multipart/form-data">""" % upload_url)
diventa
upload_url_rpc = blobstore.create_upload_url_async('/upload')
slow_operation()
upload_url = upload_url_rpc.get_result()
self.response.out.write("""<form action="%s" method="POST"
enctype="multipart/form-data">""" % upload_url)
In questo esempio, l'applicazione esegue il codice slow_operation() contemporaneamente alla generazione dell'URL di caricamento da parte di Blobstore.
Quote e limiti
Lo spazio utilizzato per i valori di Blobstore contribuisce alla quota Dati archiviati (fatturabili). Le entità di informazioni sui blob in Datastore vengono conteggiate ai fini dei limiti correlati a Datastore. Tieni presente che Cloud Storage è un servizio a pagamento; ti verrà addebitato un costo in base al listino prezzi di Cloud Storage.
Per saperne di più sulle quote di sicurezza a livello di sistema, consulta Quote.
Oltre alle quote di sicurezza a livello di sistema, si applicano i seguenti limiti specificamente all'utilizzo dell'archivio BLOB:
- La dimensione massima dei dati di Blobstore che possono essere letti dall'applicazione con una chiamata API è 32 megabyte.
- Il numero massimo di file che possono essere caricati in un singolo POST del modulo è 500.