Gestione dei file statici

Spesso le applicazioni devono pubblicare file statici come JavaScript, immagini e CSS oltre a gestire le richieste dinamiche. Le app nell'ambiente flessibile possono pubblicare file statici da un'opzione di Google Cloud come Cloud Storage, pubblicarli direttamente o utilizzare una rete CDN (Content Delivery Network) di terze parti.

Gestione dei file da Cloud Storage

Cloud Storage può ospitare asset statici per le app web dinamiche. I vantaggi dell'utilizzo di Cloud Storage invece di quelli forniti direttamente dall'app includono:

  • Cloud Storage funziona essenzialmente come una rete di distribuzione dei contenuti. Non è richiesta alcuna configurazione speciale perché, per impostazione predefinita, nella cache di Cloud Storage globale viene memorizzato nella cache qualsiasi oggetto leggibile al pubblico.
  • Il carico dell'app verrà ridotto grazie all'offload della pubblicazione di asset statici in Cloud Storage. A seconda del numero di asset statici di cui disponi e della frequenza di accesso, il costo di esecuzione dell'app può ridursi in modo significativo.
  • L'utilizzo della larghezza di banda per l'accesso ai contenuti può spesso essere inferiore con Cloud Storage.

Puoi caricare i tuoi asset in Cloud Storage utilizzando lo strumento a riga di comando gsutil o l'API Cloud Storage.

La libreria client di Google Cloud fornisce un client Python per l'archiviazione su Cloud Storage che permette di archiviare e recuperare i dati con Cloud Storage in un'app di App Engine.

Esempio di pubblicazione da un bucket Cloud Storage

Questo semplice esempio crea un bucket di Cloud Storage e carica asset statici utilizzando l'interfaccia a riga di comando di Google Cloud:

  1. Crea un bucket. È comune, ma non obbligatorio, assegnare un nome al bucket in base all'ID progetto. Il nome del bucket deve essere univoco a livello globale.

    gsutil mb gs://<your-bucket-name>
    
  2. Imposta l'ACL per concedere l'accesso in lettura agli elementi nel bucket.

    gsutil defacl set public-read gs://<your-bucket-name>
    
  3. Carica elementi nel bucket. Il comando rsync è in genere il modo più rapido e semplice per caricare e aggiornare gli asset. Potresti anche usare cp.

    gsutil -m rsync -r ./static gs://<your-bucket-name>/static
    

Ora puoi accedere alle risorse statiche tramite https://storage.googleapis.com/<your-bucket-name>/static/....

Per maggiori dettagli su come utilizzare Cloud Storage per pubblicare asset statici, incluse le modalità di pubblicazione da un nome di dominio personalizzato, consulta la sezione Come ospitare un sito web statico.

Gestione di file da altri servizi Google Cloud

Hai anche la possibilità di utilizzare Cloud CDN o altri servizi di archiviazione di Google Cloud.

Pubblicazione di file direttamente dalla tua app

La pubblicazione di file dalla tua applicazione è in genere semplice, ma esistono alcuni svantaggi che dovresti considerare:

  • Le richieste per i file statici possono utilizzare risorse che altrimenti sarebbero utilizzate per le richieste dinamiche.
  • A seconda della configurazione, la pubblicazione dei file dall'app può causare latenza di risposta, che può anche influire sulla creazione di nuove istanze per la gestione del carico.

Esempio di pubblicazione di file statici con l'app

La maggior parte dei framework web include il supporto per la pubblicazione di file statici. In questo esempio, l'app utilizza la funzionalità integrata di Flask per pubblicare file nella directory ./static dall'URL /static.

L'app include una vista che esegue il rendering del modello. Flask pubblica automaticamente tutto ciò che si trova nella directory ./static senza alcuna configurazione aggiuntiva.

import logging

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def hello():
    return render_template('index.html')

@app.errorhandler(500)
def server_error(e):
    logging.exception('An error occurred during a request.')
    return """
    An internal error occurred: <pre>{}</pre>
    See logs for full stacktrace.
    """.format(e), 500

if __name__ == '__main__':
    # This is used when running locally. Gunicorn is used to run the
    # application on Google App Engine. See entrypoint in app.yaml.
    app.run(host='127.0.0.1', port=8080, debug=True)

Il modello sottoposto a rendering dalla vista include un foglio di stile che si trova all'indirizzo /static/main.css.

<!doctype html>
<html>
<head>
  <title>Static Files</title>
  <!--
  Flask automatically makes files in the 'static' directory available via
  '/static'.
  -->
  <link rel="stylesheet" type="text/css" href="/static/main.css">
</head>
<body>
  <p>This is a static file serving example.</p>
</body>
</html>

Il foglio di stile si trova in ./static/main.css.

body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #CCCCFF;
}

Altri framework Python, come Django, Pyramid e Bottle in genere supportano la pubblicazione di file statici direttamente dall'app. Fai riferimento alla documentazione per dettagli su come configurare e utilizzare i contenuti statici.

Pubblicazione da una rete CDN (Content Delivery Network) di terze parti

Puoi utilizzare qualsiasi CDN esterna di terze parti per pubblicare file statici e richieste dinamiche di memorizzazione nella cache, ma la tua app potrebbe aumentare i tempi di latenza e i costi.

Per migliorare le prestazioni, devi utilizzare una rete CDN di terze parti che supporti CDN Interconnect.