Les fichiers statiques dans Flask - robots.txt, sitemap.xml (mod_wsgi)
-
27-09-2019 - |
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:)
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.