C'est donc gênant. J'ai une application que j'ai jeté ensemble Flask
et pour l'instant, elle ne sert qu'une seule page HTML statique avec des liens vers CSS et JS. Et je ne trouve pas où dans la documentation Flask
décrit le retour de fichiers statiques. Oui, je pourrais utiliser render_template
mais je sais que les données ne sont pas modélisées. J'aurais pensé send_file
ou url_for
c'était la bonne chose, mais je ne pouvais pas les faire fonctionner. En attendant, j'ouvre les fichiers, je lis le contenu et je mets en place un Response
mimetype approprié:
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 une URL pour cela? Je sais que ça va être très simple.
python
flask
static-files
Hughdbrown
la source
la source
Réponses:
La méthode préférée consiste à utiliser nginx ou un autre serveur Web pour servir des fichiers statiques; ils pourront le faire plus efficacement que Flask.
Cependant, vous pouvez utiliser
send_from_directory
pour envoyer des fichiers à partir d'un répertoire, ce qui peut être assez pratique dans certaines situations:Ne pas utiliser
send_file
ousend_static_file
avec un chemin fourni par l' utilisateur.send_static_file
exemple:la source
send_from_directory
est conçu pour résoudre ce problème de sécurité. Il existe une erreur si le chemin mène à l'extérieur du répertoire particulier.<path>
équivaut à<string:path>
, et parce que vous voulez que Flask assure un paramètre de type chemin que vous demandez<path:path>
.Si vous souhaitez simplement déplacer l'emplacement de vos fichiers statiques, la méthode la plus simple consiste à déclarer les chemins dans le constructeur. Dans l'exemple ci-dessous, j'ai déplacé mes modèles et fichiers statiques dans un sous-dossier appelé
web
.static_url_path=''
supprime tout chemin précédent de l'URL (c'est-à-dire la valeur par défaut/static
).static_folder='web/static'
pour servir tous les fichiers trouvés dans le dossier enweb/static
tant que fichiers statiques.template_folder='web/templates'
de même, cela modifie le dossier des modèles.En utilisant cette méthode, l'URL suivante renverra un fichier CSS:
Et enfin, voici un aperçu de la structure des dossiers, où se
flask_server.py
trouve l'instance Flask:la source
get_static_file('index.html')
?Vous pouvez également, et c'est mon préféré, définir un dossier comme chemin statique afin que les fichiers à l'intérieur soient accessibles pour tout le monde.
Avec cet ensemble, vous pouvez utiliser le HTML standard:
la source
project/static/style.css
disponible.Je suis sûr que vous y trouverez ce dont vous avez besoin: http://flask.pocoo.org/docs/quickstart/#static-files
Fondamentalement, vous avez juste besoin d'un dossier "statique" à la racine de votre package, puis vous pouvez utiliser
url_for('static', filename='foo.bar')
ou directement un lien vers vos fichiers avec http://example.com/static/foo.bar .EDIT : Comme suggéré dans les commentaires, vous pouvez utiliser directement le
'/static/foo.bar'
chemin URL MAIS lesurl_for()
frais généraux (en termes de performances) sont assez faibles, et en l'utilisant, vous pourrez facilement personnaliser le comportement par la suite (changer le dossier, changer le chemin URL, déplacer vos fichiers statiques vers S3, etc.).la source
'/static/foo.bar'
directement?Vous pouvez utiliser cette fonction:
la source
send_static_file
avec une entrée utilisateur. N'utilisez pas cette solution dans quelque chose d'important.Ce que j'utilise (et cela fonctionne très bien) est un répertoire "modèles" et un répertoire "statique". Je place tous mes fichiers .html / modèles de flacons dans le répertoire des modèles et statique contient CSS / JS. render_template fonctionne très bien pour les fichiers html génériques à ma connaissance, quelle que soit la mesure dans laquelle vous avez utilisé la syntaxe de création de modèles de Flask. Voici un exemple d'appel dans mon fichier views.py.
Assurez-vous simplement d'utiliser url_for () lorsque vous voulez référencer un fichier statique dans le répertoire statique séparé. Vous finirez probablement par le faire de toute façon dans vos liens de fichiers CSS / JS en html. Par exemple...
Voici un lien vers le didacticiel informel "canonique" de Flask - plein de bons conseils ici pour vous aider à démarrer.
http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
la source
Un exemple de travail le plus simple basé sur les autres réponses est le suivant:
Avec le HTML appelé index.html :
IMPORTANT: Et index.html est dans un dossier appelé statique , ce
<projectpath>
qui signifie a le.py
fichier et<projectpath>\static
a lehtml
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 du dossier si demandé, utilisez ce
Ce qui est essentiellement
BlackMamba
la réponse, alors donnez-leur une note positive.la source
Pour un flux angulaire + passe-partout qui crée l'arborescence de dossiers suivante:
J'utilise la solution suivante:
Il permet de redéfinir le dossier «statique» sur personnalisé.
la source
J'ai donc fait fonctionner les choses (basé sur la réponse @ user1671599) et je voulais le partager avec vous.
(J'espère que je le fais bien puisque c'est ma première application en Python)
J'ai fait ça -
Structure du projet:
server.py:
AppStarter.py:
la source
L'une des façons les plus simples de le faire. À votre santé!
demo.py
Créez maintenant un nom de dossier appelé modèles . Ajoutez votre index.html fichier à l' intérieur des modèles dossier
index.html
Structure du projet
la source
render_template
solution mais que je ne voulais pas le faire car le fichier était statique sans remplacement: "Oui, je pourrais utiliser render_template mais je sais que les données ne sont pas modélisées."Pensée à partager .... cet exemple.
Cela fonctionne mieux et simplement.
la source
Utiliser
redirect
eturl_for
Celui-ci sert tous les fichiers (css & js ...) référencés dans votre html.
la source
La manière la plus simple est de créer un dossier statique dans le dossier principal du projet. Dossier statique contenant des fichiers .css.
dossier principal
Image du dossier principal contenant les dossiers statiques et modèles et le script de la fiole
ballon
html (mise en page)
html
la source
Si vous avez des modèles dans votre répertoire racine, placer l'application = Flask ( nom ) fonctionnera si le fichier qui le contient se trouve également au même emplacement, si ce fichier est dans un autre emplacement, vous devrez spécifier l'emplacement du modèle à activer Flacon pour pointer vers l'emplacement
la source
Toutes les réponses sont bonnes, mais ce qui a bien fonctionné pour moi, c'est simplement d'utiliser la fonction simple
send_file
de Flask. Cela fonctionne bien lorsque vous avez juste besoin d'envoyer un fichier html comme réponse lorsque host: port / ApiName affichera la sortie du fichier dans le navigateurla source
Par défaut, flask utilise un dossier "templates" pour contenir tous vos fichiers de template (n'importe quel fichier en texte brut, mais généralement
.html
ou une sorte de langage de template tel que jinja2) & un dossier "statique" pour contenir tous vos fichiers statiques (ie.js
.css
et vos images).Dans votre
routes
, vous pouvez utiliserrender_template()
pour rendre un fichier de modèle (comme je le dis ci-dessus, par défaut, il est placé dans letemplates
dossier) comme réponse à votre demande. Et dans le fichier de modèle (c'est généralement un fichier de type .html), vous pouvez utiliser certains.js
fichiers et / ou `.css ', donc je suppose que votre question est de savoir comment lier ces fichiers statiques au fichier de modèle actuel.la source
Si vous essayez simplement d'ouvrir un fichier, vous pouvez utiliser
app.open_resource()
. La lecture d'un fichier ressemblerait donc à quelque chosela source