Comment servir les fichiers statiques dans le Flacon

Donc, c'est embarrassant. J'ai une application que j'ai jeté dans Flask et pour l'instant, il est juste à servir une seule page HTML statique avec quelques liens vers des CSS et JS. Et je ne trouve pas où dans la documentation Flask décrit le retour des fichiers statiques. Oui, je pourrais l'utiliser render_template mais je sais que les données ne sont pas templatized. J'aurais pensé send_file ou url_for était la bonne chose, mais je ne pouvais pas obtenir ces au travail. En attendant, je vais ouvrir les fichiers, la lecture du contenu, et le gréement d'un Response appropriées type mime:

import os.path

from flask import Flask, Response


app = Flask(__name__)
app.config.from_object(__name__)


def root_dir():  # pragma: no cover
    return os.path.abspath(os.path.dirname(__file__))


def get_file(filename):  # pragma: no cover
    try:
        src = os.path.join(root_dir(), filename)
        # Figure out how flask returns static files
        # Tried:
        # - render_template
        # - send_file
        # This should not be so non-obvious
        return open(src).read()
    except IOError as exc:
        return str(exc)


@app.route('/', methods=['GET'])
def metrics():  # pragma: no cover
    content = get_file('jenkins_analytics.html')
    return Response(content, mimetype="text/html")


@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def get_resource(path):  # pragma: no cover
    mimetypes = {
        ".css": "text/css",
        ".html": "text/html",
        ".js": "application/javascript",
    }
    complete_path = os.path.join(root_dir(), path)
    ext = os.path.splitext(path)[1]
    mimetype = mimetypes.get(ext, "text/html")
    content = get_file(complete_path)
    return Response(content, mimetype=mimetype)


if __name__ == '__main__':  # pragma: no cover
    app.run(port=80)

Quelqu'un veut donner un exemple de code ou d'une url pour cela? Je sais que cela va être simple.

  • Pourquoi ne pas utiliser nginx ou d'autres serveurs web pour servir les fichiers statiques.
  • Veuillez garder à l'esprit que la façon dont vous avez réellement "servir" les fichiers seront probablement différentes entre la production (sur votre serveur web) et de développement (sur votre ordinateur local, ou une autre zone de test). Que certaines réponses ont souligné, vous n'aurez probablement PAS envie de servir vos fichiers statiques avec flacon, mais plutôt dans leur propre répertoire et alors votre serveur web (Apache, nginx, etc.) serveur les fichiers directement.
  • Double Possible de les fichiers Statiques dans le Flacon robot.txt, sitemap.xml (mod_wsgi)
  • "Pourquoi ne pas utiliser nginx ..." Parce que quand je suis en cours d'exécution dans le mode développeur sur mon ordinateur portable, il est agréable de vous devez exécuter une chose et une seule chose. Oui, ça rend les choses un peu différentes, mais c'est correct.
  • Même dans la production, c'est très très courant de voir cela, avec bien sûr un cache couche à l'avant (comme un Vernis ou Nginx ou un CDN).
  • Voir aussi: Fiole plan statique répertoire ne fonctionne pas?

InformationsquelleAutor hughdbrown | 2013-12-17