Question

Y at-il une solution intelligente aux fichiers statiques stocker dans l'application de Flask répertoire racine. robots.txt et sitemap.xml devraient être trouvés dans /, donc mon idée était de créer des itinéraires pour les:

@app.route('/sitemap.xml', methods=['GET'])
def sitemap():
  response = make_response(open('sitemap.xml').read())
  response.headers["Content-type"] = "text/plain"
  return response

Il doit y avoir quelque chose de plus pratique:)

Était-ce utile?

La solution

La meilleure façon est de mettre static_url_path à la racine url

from flask import Flask

app = Flask(__name__, static_folder='static', static_url_path='')

Autres conseils

@vonPetrushev est juste, dans la production, vous aurez envie de servir des fichiers statiques via nginx ou apache, mais pour le développement, il est agréable d'avoir votre environnement de dev simple, avoir votre application python servir le contenu statique, si bien que vous ne à vous soucier de modifier les configurations et plusieurs projets. Pour ce faire, vous aurez envie d'utiliser le SharedDataMiddleware.

from flask import Flask
app = Flask(__name__)
'''
Your app setup and code
'''
if app.config['DEBUG']:
    from werkzeug import SharedDataMiddleware
    import os
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
      '/': os.path.join(os.path.dirname(__file__), 'static')
    })

Cet exemple suppose que vos fichiers statiques sont dans le dossier « statique », adapter à ce qui convient à votre environnement.

La propre réponse à cette question est le réponse à cette (identique) question :

from flask import Flask, request, send_from_directory
app = Flask(__name__, static_folder='static')    

@app.route('/robots.txt')
@app.route('/sitemap.xml')
def static_from_root():
    return send_from_directory(app.static_folder, request.path[1:])

Pour résumer:

  • comme David l'a souligné, avec la configuration droite, il ok pour servir quelques fichiers statiques par prod
  • recherche /robots.txt ne devrait pas entraîner une redirection vers /static/robots.txt. (En Seans répondre à c'est pas évident comment cela s'atteint.)
  • il est pas propre à ajouter des fichiers statiques dans l'application dossier racine
  • enfin, la solution proposée a l'air beaucoup plus propre que l'ajout d'approche middleware:

Bien que ce soit une vieille réponse à votre question, je réponds à cela parce que ce poste revient assez élevé dans les résultats de Google. Bien qu'il n'est pas couvert dans la documentation, si vous lisez l'API docs pour l'application Flask constructeur de l'objet, il est couvert. En passant le paramètre nommé static_folder comme ceci:

from flask import Flask
app = Flask(__name__,
            static_folder="/path/to/static",
            template_folder="/path/to/templates")

... vous pouvez définir où les fichiers statiques sont servis à partir. De même, vous pouvez définir un template_folder, le nom vous static_url_path.

Au service de fichiers statiques n'a rien à voir avec l'application qui est destiné à fournir un contenu dynamique. La bonne façon de servir les fichiers statiques dépend de ce serveur que vous utilisez. Après tout, quand vous obtenez votre application et en cours d'exécution, vous aurez besoin de le lier à un serveur Web. Je ne peux parler que pour apache httpd, donc la manière de servir des fichiers statiques est défini dans l'hôte virtuel que vous liez à votre application par mod-wsgi. Voici le guide qui vous montrera comment servir sitemaps, robots.txt ou tout contenu statique: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

Une autre façon d'envoyer des fichiers statiques est d'utiliser un fourre-tout règle comme ceci:

@app.route('/<path:path>')
def catch_all(path):
    if not app.debug:
        flask.abort(404)
    try:
        f = open(path)
    except IOError, e:
        flask.abort(404)
        return
    return f.read()

J'utiliser pour essayer de minimiser la mise en place lors de l'élaboration. J'ai eu l'idée de http://flask.pocoo.org/snippets/57/

En outre, je développe sur mon flacon en utilisant la machine autonome, mais le déploiement avec Apache dans le serveur de production. J'utilise:

file_suffix_to_mimetype = {
    '.css': 'text/css',
    '.jpg': 'image/jpeg',
    '.html': 'text/html',
    '.ico': 'image/x-icon',
    '.png': 'image/png',
    '.js': 'application/javascript'
}
def static_file(path):
    try:
        f = open(path)
    except IOError, e:
        flask.abort(404)
        return
    root, ext = os.path.splitext(path)
    if ext in file_suffix_to_mimetype:
        return flask.Response(f.read(), mimetype=file_suffix_to_mimetype[ext])
    return f.read()

[...]

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-d', '--debug', dest='debug', default=False,
                      help='turn on Flask debugging', action='store_true')

    options, args = parser.parse_args()

    if options.debug:
        app.debug = True
        # set up flask to serve static content
        app.add_url_rule('/<path:path>', 'static_file', static_file)
    app.run()

Cela aurait été ajouté car cette question a été posée, mais je regardais à travers la « helpers.py » de ballon et je l'ai trouvé flask.send_from_directory:

send_from_directory(directory, filename, **options)
'''
  send_from_directory(directory, filename, **options)
  Send a file from a given directory with send_file.  This
  is a secure way to quickly expose static files from an upload folder
  or something similar.
'''

... dont les références flask.send_file:

send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False)

... qui semble mieux pour plus de contrôle, bien que passe send_from_directory ** les options directement jusqu'à send_file.

De la documentation ici: http://flask.pocoo.org/docs/ QuickStart / # statiques-fichiers

  

Dynamique des applications web statiques ont besoin   fichiers. C'est généralement là où   les fichiers CSS et JavaScript sont   provenir de. Idéalement, votre serveur web   est configuré pour les servir pour vous,   mais au cours du développement Flask peut faire   aussi. Il suffit de créer un dossier   appelé statique dans votre forfait ou suivant   à votre module et il sera   disponible à / statique sur la   application.

     

Pour générer des URL à cette partie de la   URL, utilisez l'URL spécial « statique »   nom:

     

url_for ( 'statique',   filename = 'style.css')

     

Le fichier doit être stocké sur le   système de fichiers comme statique / style.css.

Je vais avoir le même dilemme que bien. Est-ce une recherche et a trouvé ma réponse (MHO):

pourrait tout aussi bien citer la documentation

  

Dynamique des applications web ont besoin des fichiers statiques aussi bien. C'est généralement là où les fichiers CSS et JavaScript viennent. Idéalement, votre serveur Web est configuré pour les servir pour vous, mais au cours du développement Flask peut le faire aussi bien . Il suffit de créer un dossier appelé statique dans votre package ou à côté de votre module et il sera disponible à / statique sur l'application.

à mon humble avis: Lorsque votre application est pour production , portion de fichier statique doit être (ou est idéalement) configuré sur le serveur Web (nginx, apache); mais pendant développement , Flask fait disponible pour servir les fichiers statiques. Ceci pour vous aider à développer rapidement - pas besoin de serveurs Web de configuration et autres.

it helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top