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?
Vous devez vous connecter pour publier un commentaire.
La méthode préférée consiste à utiliser nginx ou un autre serveur web de servir les fichiers statiques; ils vont être en mesure de le faire plus efficacement que ne le Flacon.
Toutefois, vous pouvez utiliser
send_from_directory
pour envoyer des fichiers à partir d'un répertoire, ce qui peut être très pratique dans certaines situations:Ne pas utilisation
send_file
ousend_static_file
avec une fourni par l'utilisateur chemin.send_static_file
exemple:send_from_directory
est conçu pour résoudre ce problème de sécurité. Il existe d'erreur si le chemin mène à l'extérieur du répertoire particulier.return redirect(url_for('static', filename='index.html'))
au lieu de send_static_file si c'est ce que vous allez pour. Les deux sont bons. J'utilise rediriger sur mon serveur de dev.<path:path>
et pas<path>
?<path>
est équivalent à<string:path>
, et parce que vous voulez Flacon pour assurer un chemin, comme les paramètre que vous demandez pour<path:path>
.send_static_file
ne fonctionnent pas comme prévu lorsquesend_from_directory
échoue? Je ne peux pas comprendre comment déboguer lesend_from_directory
fonction et savoir pourquoi il me404
s. (Mon problème est ici, si vous êtes curieux)Si vous voulez juste pour déplacer l'emplacement de vos fichiers statiques, alors la méthode la plus simple est de déclarer les chemins d'accès dans le constructeur. Dans l'exemple ci-dessous, j'ai déplacé mes modèles et des fichiers statiques dans un sous-dossier appelé
web
.static_url_path=''
supprime tous les précédents chemin de l'URL (c'est à direla valeur par défaut
/static
).static_folder='web/static'
dira Flacon de servir les fichiers trouvés àweb/static
.template_folder='web/templates'
, de la même façon, ce qui change lale dossier de modèles.
À l'aide de cette méthode, l'URL suivante sera de retour un fichier CSS:
Et enfin, voici un composant logiciel enfichable de la structure de dossier, où
flask_server.py
est le Flacon exemple:Je suis sûr que vous trouverez ce dont vous avez besoin: http://flask.pocoo.org/docs/quickstart/#static-files
Fondamentalement, vous avez juste besoin d'un "statique" dossier à la racine de votre colis, et vous pouvez ensuite utiliser
url_for('static', filename='foo.bar')
ou directement de lien vers vos fichiers avec http://example.com/static/foo.bar.MODIFIER: Comme suggéré dans les commentaires que vous pourriez utiliser directement les
'/static/foo.bar'
chemin d'accès d'URL MAISurl_for()
frais généraux (performance sage) est assez faible, et l'utiliser signifie que vous serez en mesure de facilement personnaliser le comportement de la suite (changer le dossier, modifiez le chemin d'accès d'URL, déplacez vos fichiers statiques pour S3, etc).'/static/foo.bar'
directement?Vous pouvez aussi, et c'est mon préféré, définir un dossier comme statique chemin de sorte que les fichiers à l'intérieur sont accessibles pour tout le monde.
Avec qui vous pouvez utiliser le standard HTML:
project/static/style.css
disponibles.Ce que j'utilise (et ça a été génial de travailler) est un des "modèles" de répertoire et un "statique" du répertoire. Je place tous mes .les fichiers html/Flacon de modèles à l'intérieur du répertoire de modèles et statique contient CSS/JS. render_template fonctionne très bien pour les fichiers html à ma connaissance, quelle que soit la mesure à laquelle vous avez utilisé Flacon de syntaxe spécifique. Ci-dessous est un exemple d'appel dans mon views.py fichier.
Juste assurez-vous d'utiliser url_for() si vous ne voulez référence statique fichier dans le répertoire statique. Vous aurez probablement finir par faire cela de toute façon dans votre CSS/JS des liens vers des fichiers au format html. Par exemple...
Voici un lien vers le "canonique" informel Flacon tutoriel - beaucoup de bons conseils ici pour vous aider à frapper le sol en cours d'exécution.
http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
Vous pouvez utiliser cette fonction :
send_static_file
avec la saisie de l'utilisateur. Ne pas utiliser cette solution dans quelque chose d'important.Un simple exemple de travail sur la base des autres réponses est la suivante:
Avec le HTML appelé index.html:
IMPORTANT: Et index.html dans un dossier appelé statique, sens
<projectpath>
a la.py
fichier, et<projectpath>\static
a lahtml
fichier.Si vous souhaitez que le serveur soit visible sur le réseau, utilisez
app.run(debug=True, host='0.0.0.0')
EDIT: Pour afficher tous les fichiers dans le dossier si nécessaire, utilisez ce
Qui est essentiellement
BlackMamba
's réponse, afin de leur donner un upvote.Angulaire+passe-partout de débit, ce qui crée à côté de l'arbre de dossiers:
Je utiliser la solution suivante:
Il contribue à redéfinir "statique" dossier personnalisé.
Donc j'ai eu des choses de travail (basé sur @user1671599 réponse) et je voulais partager avec vous les gars.
(J'espère que je suis en train de faire puisque c'est ma première application en Python)
Je l'ai fait -
Structure de projet:
server.py:
AppStarter.py:
Pensé à partager.... cet exemple.
Cela fonctionne mieux et plus simple.
L'un de la manière la plus simple de le faire. Cheers!
demo.py
Maintenant créer un dossier du nom appelé modèles.
Ajouter votre index.html fichier à l'intérieur de modèles dossier
index.html
Structure De Projet
render_template
solution, mais ne voulait pas le faire parce que le fichier est statique sans remplacements: "Oui, je pourrais l'utiliser render_template mais je sais que les données ne sont pas templatized."Cette serveurs tous les fichiers (css & js...) référencées dans votre fichier html.
Toutes les réponses sont bonnes, mais ce qui a bien fonctionné pour moi, c'est juste à l'aide de la fonction simple
send_file
de Flacon. Cela fonctionne bien lorsque vous avez juste besoin d'envoyer un fichier html comme réponse quand host:port/ApiName montrera la sortie du fichier dans le navigateurPar défaut, flacon utiliser un dossier "modèles" pour contenir tous vos fichiers de modèle(n'importe quel fichier de texte brut, mais généralement
.html
ou une sorte de modèle de la langue tels que jinja2 ) & "statique" dossier contenant tous vos fichiers statiques(c'est à dire.js
.css
et de vos images).Dans votre
routes
, u peut utiliserrender_template()
de rendre un fichier de modèle (comme je l'ai dit ci-dessus, par défaut il est placé dans letemplates
dossier) que la réponse à votre demande. Et dans le fichier de modèle (c'est généralement une .html fichier), u peut utiliser certains.js
et/ou".css les fichiers, donc je suppose que votre question est de savoir comment u le lien entre ces fichiers statiques pour le modèle de fichier.Si vous essayez juste d'ouvrir un fichier, vous pouvez utiliser
app.open_resource()
. Donc, la lecture d'un fichier devrait ressembler à quelque chose commeLa façon la plus simple est de créer un statique dossier dans le dossier de projet principal. Statique dossier contenant .les fichiers css.
dossier principal
Image de dossier principal contenant statique et dossiers de modèles et flacon de script
flacon
html (mise en page)
html