Maison >développement back-end >Tutoriel Python >Comment puis-je servir efficacement des fichiers statiques dans une application Flask ?

Comment puis-je servir efficacement des fichiers statiques dans une application Flask ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-21 01:07:10450parcourir

How Can I Serve Static Files Efficiently in a Flask Application?

Servir des fichiers statiques dans Flask

Servir des fichiers statiques est une tâche courante dans le développement Web. Flask propose plusieurs méthodes pour gérer cela, notamment en utilisant la route de dossiers statiques intégrée ou la fonction send_from_directory.

Route de dossiers statiques intégrée

Flask crée automatiquement un route pour les fichiers statiques sous /static/ chemin. Pour servir des fichiers statiques à partir de cette route, placez-les simplement dans le dossier statique à côté de votre module d'application Flask. Vous pouvez ensuite utiliser url_for pour créer un lien vers les fichiers statiques.

from flask import url_for

@app.route('/')
def home():
    return url_for('static', filename='css/style.css')

Fonction send_from_directory

La fonction send_from_directory vous permet de servir des fichiers à partir de n'importe quel répertoire de votre application. Il prend deux arguments : le répertoire de base et le chemin du fichier demandé. Il garantit que le chemin demandé est contenu dans le répertoire de base, empêchant ainsi les attaques par traversée de répertoire.

from flask import send_from_directory

@app.route('/reports/<path:path>')
def send_report(path):
    return send_from_directory('reports', path)

Remarque :

N'utilisez pas send_file ou send_static_file avec user- chemins fournis, car cela peut vous exposer à des vulnérabilités. Utilisez plutôt send_from_directory, qui est conçu pour gérer en toute sécurité les chemins fournis par l'utilisateur.

Servir des fichiers en mémoire

Si vous devez servir un fichier généré dans mémoire sans l'écrire sur le disque, vous pouvez utiliser BytesIO pour créer un objet fichier en mémoire et le transmettre à send_file. Vous devrez également spécifier le nom du fichier, le type de contenu et d'autres attributs.

from io import BytesIO
import zipfile

@app.route('/download.zip')
def download_zip():
    buffer = BytesIO()
    zipfile.ZipFile(buffer, 'w').write('file.txt')
    buffer.seek(0)
    
    return send_file(buffer, 
                       mimetype='application/zip', 
                       as_attachment=True, 
                       attachment_filename='download.zip')

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn