Comment servir des fichiers statiques dans Flask
P粉754473468
P粉754473468 2023-08-23 15:50:41
0
2
564
<p>C'est donc embarrassant. J'ai créé une application dans <code>Flask</code> et actuellement, elle ne sert qu'une page HTML statique avec quelques liens vers CSS et JS. Je ne trouve pas de place dans la documentation pour <code>Flask</code> Oui, je peux utiliser <code>render_template</code> mais je sais que les données ne sont pas modélisées. Je pense que <code>send_file</code> ou <code>url_for</code> sont corrects, mais je n'arrive pas à les faire fonctionner. En attendant, j'ouvre le fichier, lis le contenu et définit la réponse <code>Response</code> en utilisant le type MIME approprié : </p> <pre class="brush:php;toolbar:false;">importer os.path à partir de l'importation du flacon Flacon, réponse application = Flacon (__nom__) app.config.from_object(__name__) def root_dir() : # pragma : pas de couverture retourner os.path.abspath(os.path.dirname(__file__)) def get_file(filename): # pragma : pas de couverture essayer: src = os.path.join(root_dir(), nom de fichier) # Découvrez comment Flask renvoie les fichiers statiques #Essayé: # - modèle de rendu # - envoyer le fichier # Cela ne devrait pas être si évident retourner open(src).read() sauf IOError comme exc : retourner str(exc) @app.route('/', méthodes=['GET']) def metrics() : # pragma : pas de couverture contenu = get_file('jenkins_analytics.html') renvoyer la réponse (content, mimetype="text/html") @app.route('/', defaults={'path': ''}) @app.route('/<chemin:chemin>') def get_resource(path): # pragma : pas de couverture types MIME = { ".css": "texte/css", ".html": "texte/html", ".js": "application/javascript", } chemin_complet = os.path.join(root_dir(), chemin) ext = os.path.splitext(chemin)[1] mimetype = mimetypes.get(ext, "text/html") contenu = get_file (chemin_complet) renvoyer la réponse (contenu, mimetype = mimetype) if __name__ == '__main__' : # pragma : pas de couverture app.run(port=80)</pre> <p>Quelqu'un souhaite-t-il fournir un exemple de code ou une URL pour cela ? Je savais que ce serait très simple. </p>
P粉754473468
P粉754473468

répondre à tous(2)
P粉155551728

Si vous souhaitez simplement déplacer l'emplacement de vos fichiers statiques, le plus simple est de déclarer le chemin dans le constructeur. Dans l'exemple ci-dessous, j'ai déplacé les modèles et les fichiers statiques dans un sous-dossier nommé web .

app = Flask(__name__,
            static_url_path='', 
            static_folder='web/static',
            template_folder='web/templates')
  • static_url_path='' Supprimez tous les chemins précédents de l'URL.
  • static_folder='web/static' Sert tout fichier trouvé dans un dossier web/static Sous forme de fichier statique.
  • template_folder='web/templates' De même, cela change Dossier de modèles.

En utilisant cette méthode, l'URL suivante renverra un fichier CSS :

<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">

Enfin, voici un instantané de la structure des dossiers, où flask_server.py est l'instance Flask :

P粉212971745

En production, configurez un serveur HTTP (Nginx, Apache, etc.) devant l'application pour gérer /static les requêtes des dossiers statiques. Les serveurs Web dédiés sont très efficaces pour servir efficacement les fichiers statiques, même si à faible volume, vous ne remarquerez peut-être pas la différence par rapport à Flask.

Flask en créera automatiquement un /static/ 路由,该路由将为 Python 旁边的 static 文件夹下的任何 filename 提供服务定义 Flask 应用程序的模块。使用url_for链接到静态文件:url_for('static', filename='js/analytics.js')

Vous pouvez également utiliser send_from_directory pour servir des fichiers à partir d'un répertoire au sein de votre propre itinéraire. Cela prend un répertoire de base et un chemin, et garantit que le chemin est contenu dans ce répertoire afin que les chemins fournis par l'utilisateur puissent être acceptés en toute sécurité. Cela peut être utile si vous souhaitez vérifier quelque chose avant de servir le fichier, par exemple si l'utilisateur connecté dispose d'autorisations.

from flask import send_from_directory

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

N'utilisez passend_file ou send_static_file avec les chemins fournis par l'utilisateur. Cela vous exposera à une attaque par traversée de répertoire send_filesend_static_file 与用户提供的路径一起使用。这将使您面临目录遍历攻击send_from_directory.

Conçu pour gérer en toute sécurité les chemins fournis par l'utilisateur vers des répertoires connus, générant une erreur si le chemin tente de s'échapper du répertoire.

BytesIO 对象传递给 send_file 将其作为文件提供。在这种情况下,您需要将其他参数传递给 send_fileSi vous générez le fichier en mémoire sans l'écrire dans le système de fichiers, vous pouvez transmettre un objet BytesIO à send_file

Fournissez-le sous forme de fichier. Dans ce cas, vous devez transmettre des paramètres supplémentaires à send_file car il ne peut pas déduire des éléments tels que le nom de fichier ou le type de contenu. 🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal