807 Stimmen

Wie man statische Dateien in Flask bereitstellt

Also das ist peinlich. Ich habe eine Anwendung in Flask zusammengeworfen und derzeit dient sie nur dazu, eine einzelne statische HTML-Seite mit einigen Links zu CSS und JS bereitzustellen. Und ich kann nicht finden, wo in der Dokumentation Flask beschreibt, wie man statische Dateien zurückgibt. Ja, ich könnte render_template verwenden, aber ich weiß, dass die Daten nicht in Templates aufbereitet sind. Ich hätte gedacht, dass send_file oder url_for das Richtige wären, aber ich konnte diese nicht zum Laufen bringen. In der Zwischenzeit öffne ich die Dateien, lese den Inhalt und richte eine Response mit dem entsprechenden Mimetyp ein:

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)
        # Herausfinden, wie flask statische Dateien zurückgibt
        # Versucht:
        # - render_template
        # - send_file
        # Das sollte nicht so unklar sein
        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('/')
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)

Kann mir jemand ein Code-Beispiel oder eine URL dafür geben? Ich weiß, dass das total einfach sein wird.

1voto

ESbros Punkte 137

Der einfachste Weg ist die Erstellung eines statischen Ordners innerhalb des Hauptprojektordners. Der statische Ordner enthält .css-Dateien.

Hauptordner

/Hauptordner
/Hauptordner/templates/foo.html
/Hauptordner/static/foo.css
/Hauptordner/application.py (Flask-Skript)

Bild des Hauptordners mit statischen und Vorlagenordnern und dem Flask-Skript

Flask

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def login():
    return render_template("login.html")

html (Layout)

        Projekt(1)

                    Kamook
                    Registrieren
                    Anmelden

        {% block body %}
        {% endblock %}

html

{% extends "layout.html" %}

{% block body %}

{% endblock %}

1voto

Binoy S Kumar Punkte 249

Alle Antworten sind gut, aber was für mich gut funktioniert hat, ist die einfache Funktion send_file von Flask zu verwenden. Dies funktioniert gut, wenn Sie nur eine HTML-Datei als Antwort senden müssen, wenn host:port/ApiName im Browser die Ausgabe der Datei anzeigt

@app.route('/ApiName')
def ApiFunc():
    try:
        return send_file('ein-anderes-verzeichnis-als-stammverzeichnis/deine-datei.erweiterung')
    except Exception as e:
        logging.info(e.args[0])

1voto

Divyani Singh Punkte 481

Die URL für eine statische Datei kann unter Verwendung des statischen Endpunkts wie folgt erstellt werden:

url_for('static', filename = 'name_of_file')

1voto

TOBlender Punkte 1023

Dies ist, was für mich funktioniert hat:

import os
from flask import Flask, render_template, send_from_directory
app = Flask(__name__)

root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "wohdeineDateiensind")

@app.route('/', methods=['GET'])
def main(request):
    path = request.path
    if (path == '/'):
        return send_from_directory(root, 'index.html')
    else:
        return send_from_directory(root, path[1:])

0voto

Chaitanya Shivade Punkte 839

Wenn Sie nur versuchen, eine Datei zu öffnen, könnten Sie app.open_resource() verwenden. Das Lesen einer Datei würde also so aussehen

with app.open_resource('/static/path/yourfile'):
      # Code zum Lesen der Datei und zum Bearbeiten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X