Ricerca…


Utilizzo di file statici

Le applicazioni Web richiedono spesso file statici come file CSS o JavaScript. Per utilizzare i file statici in un'applicazione Flask, creare una cartella denominata static nel pacchetto o accanto al modulo e sarà disponibile in /static sull'applicazione.

Una struttura di esempio di progetto per l'utilizzo di modelli è la seguente:

MyApplication/
    /static/
        /style.css
        /script.js
    /templates/
        /index.html
    /app.py

app.py è un esempio di base di Flask con il rendering del modello.

from flask import Flask, render_template

app = Flask(__name__)

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

Per utilizzare il file CSS statico e JavaScript nel modello index.html, è necessario utilizzare il nome di endpoint "statico" speciale:

{{url_for('static', filename = 'style.css')}}

Quindi, index.html può contenere:

<html>
    <head>
        <title>Static File</title>
        <link href="{{url_for('static', filename = 'style.css')}}" rel="stylesheet">
        <script src="{{url_for('static', filename = 'script.js')}}"></script>
    </head>
    <body>
        <h3>Hello World!</h3>
    </body>
</html>

Dopo aver eseguito app.py vedremo la pagina Web in http: // localhost: 5000 / .

File statici in produzione (offerti dal server Web frontend)

Il webserver integrato di Flask è in grado di servire asset statici, e questo funziona bene per lo sviluppo. Tuttavia, per le distribuzioni di produzione che utilizzano qualcosa come uWSGI o Gunicorn per servire l'applicazione Flask, l'attività di servire i file statici è solitamente scaricata sul server Web frontend (Nginx, Apache, ecc.). Questo è un compito piccolo / facile con le app più piccole, specialmente quando tutte le risorse statiche si trovano in una cartella; tuttavia, per le app più grandi e / o quelle che utilizzano i plug-in di Flask che forniscono risorse statiche, può diventare difficile ricordare le posizioni di tutti questi file e copiarli / raccoglierli manualmente in una directory. Questo documento mostra come utilizzare il plugin Flask-Collect per semplificare tale compito.

Si noti che l'obiettivo di questa documentazione è sulla raccolta di asset statici. Per illustrare questa funzionalità, in questo esempio viene utilizzato il plug-in Flask-Bootstrap, che fornisce risorse statiche. Utilizza anche il plug-in Flask-Script, che viene utilizzato per semplificare il processo di creazione di attività da riga di comando. Nessuno di questi plugin è fondamentale per questo documento, sono solo in uso qui per dimostrare la funzionalità. Se si sceglie di non utilizzare Flask-Script, è necessario rivedere i documenti Flask-Collect in modi alternativi per chiamare il comando collect .

Nota anche che la configurazione del tuo server web frontend per servire queste risorse statiche è al di fuori dello scopo di questo documento, ti consigliamo di controllare alcuni esempi usando Nginx e Apache per maggiori informazioni. Basti dire che sarete aliasing degli URL che iniziano con "/ static" nella directory centralizzata che Flask-Collect creerà per voi in questo esempio.

L'app è strutturata come segue:

/manage.py - The app management script, used to run the app, and to collect static assets
/app/ - this folder contains the files that are specific to our app
    | - __init__.py - Contains the create_app function
    | - static/ - this folder contains the static files for our app.
        | css/styles.css - custom styles for our app (we will leave this file empty)
        | js/main.js - custom js for our app (we will leave this file empty)
    | - templates/index.html - a simple page that extends the Flask-Bootstrap template
  1. Innanzitutto, crea il tuo ambiente virtuale e installa i pacchetti richiesti: (your-virtualenv) $ pip installa flask-script flask-bootstrap flask-collect

  2. Stabilire la struttura del file descritta sopra:

    $ touch manage.py; mkdir -p app / {static / {css, js}, templates}; touch app / { init .py, static / {css / styles.css, js / main.js}}

  3. Stabilisci i contenuti per i file manage.py , app/__init__.py e app/templates/index.html :

# manage.py
#!/usr/bin/env python
import os
from flask_script import Manager, Server
from flask import current_app
from flask_collect import Collect
from app import create_app

class Config(object):
   # CRITICAL CONFIG VALUE: This tells Flask-Collect where to put our static files!
   # Standard practice is to use a folder named "static" that resides in the top-level of the project directory.
   # You are not bound to this location, however; you may use basically any directory that you wish.
   COLLECT_STATIC_ROOT = os.path.dirname(__file__) + '/static'
   COLLECT_STORAGE = 'flask_collect.storage.file'

app = create_app(Config)

manager = Manager(app)
manager.add_command('runserver', Server(host='127.0.0.1', port=5000))

collect = Collect()
collect.init_app(app)

@manager.command
def collect():
  """Collect static from blueprints. Workaround for issue: https://github.com/klen/Flask-Collect/issues/22"""
  return current_app.extensions['collect'].collect()

if __name__ == "__main__":
   manager.run()

# app/__init__.py
from flask import Flask, render_template
from flask_collect import Collect
from flask_bootstrap import Bootstrap

def create_app(config):
  app = Flask(__name__)
  app.config.from_object(config)

  Bootstrap(app)
  Collect(app)

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

  return app

# app/templates/index.html
{% extends "bootstrap/base.html" %}
{% block title %}This is an example page{% endblock %}

{% block navbar %}
<div class="navbar navbar-fixed-top">
  <!-- ... -->
</div>
{% endblock %}

{% block content %}
  <h1>Hello, Bootstrap</h1>
{% endblock %}
  1. Con questi file, puoi ora utilizzare lo script di gestione per eseguire l'app:
$ ./manage.py runserver # visit http://localhost:5000 to verify that the app works correctly.
  1. Ora, per raccogliere le risorse statiche per la prima volta. Prima di fare ciò, vale la pena di notare che NON dovresti avere una cartella static/ nel livello principale della tua app; è qui che Flask-Collect posizionerà tutti i file statici che raccoglierà dalla tua app e dai vari plug-in che potresti utilizzare. Se si dispone di una static/ cartella nel livello superiore della vostra app, è necessario cancellarlo del tutto prima di procedere, come punto di partenza con una lavagna pulita è una parte fondamentale della testimonianza / capire che cosa fa Flask-Collect. Nota che questa istruzione non è applicabile per l'uso quotidiano, ma è semplicemente per illustrare il fatto che Flask-Collect creerà questa directory per te, quindi inserirà un gruppo di file.

Detto ciò, è possibile eseguire il seguente comando per raccogliere le risorse statiche:

$ ./manage.py collect

Dopo aver fatto ciò, dovresti vedere che Flask-Collect ha creato questa cartella static/ primo livello e contiene i seguenti file:

$ find ./static -type f # execute this from the top-level directory of your app, same dir that contains the manage.py script
static/bootstrap/css/bootstrap-theme.css
static/bootstrap/css/bootstrap-theme.css.map
static/bootstrap/css/bootstrap-theme.min.css
static/bootstrap/css/bootstrap.css
static/bootstrap/css/bootstrap.css.map
static/bootstrap/css/bootstrap.min.css
static/bootstrap/fonts/glyphicons-halflings-regular.eot
static/bootstrap/fonts/glyphicons-halflings-regular.svg
static/bootstrap/fonts/glyphicons-halflings-regular.ttf
static/bootstrap/fonts/glyphicons-halflings-regular.woff
static/bootstrap/fonts/glyphicons-halflings-regular.woff2
static/bootstrap/jquery.js
static/bootstrap/jquery.min.js
static/bootstrap/jquery.min.map
static/bootstrap/js/bootstrap.js
static/bootstrap/js/bootstrap.min.js
static/bootstrap/js/npm.js
static/css/styles.css
static/js/main.js

E questo è tutto: usa il comando collect ogni volta che apporti modifiche al CSS o JavaScript della tua app, o quando hai aggiornato un plugin Flask che fornisce risorse statiche (come Flask-Bootstrap in questo esempio).



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow