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.

0voto

yuviscor Punkte 11

Im statischen Verzeichnis erstellen Sie ein Vorlagenverzeichnis. Fügen Sie in diesem Verzeichnis alle HTML-Dateien hinzu und erstellen Sie separate Verzeichnisse für CSS und JavaScript. Flask wird alle HTML-Dateien erkennen, die sich im Vorlagenverzeichnis befinden.

static -
       |_ templates
       |_ css
       |_ javascript
       |_ images

0voto

Harvey Punkte 65

   Standardmäßig verwendet Flask einen "Templates"-Ordner, um alle Ihre Vorlagendateien zu enthalten (beliebige Textdatei, aber normalerweise .html oder eine Art Vorlagensprache wie jinja2) & einen "static"-Ordner, um alle Ihre statischen Dateien zu enthalten (d.h. .js .css und Ihre Bilder).
   In Ihren Routes können Sie render_template() verwenden, um eine Vorlagendatei zu rendern (wie oben erwähnt, wird sie standardmäßig in den Templates-Ordner platziert) als Antwort auf Ihre Anfrage. Und in der Vorlagendatei (normalerweise eine .html-ähnliche Datei) können Sie einige .js und/oder `.css'-Dateien verwenden, daher vermute ich, dass Ihre Frage ist, wie Sie diese statischen Dateien mit der aktuellen Vorlagendatei verknüpfen.

-1voto

In meinem Fall mussten alle Dateien aus einem statischen Ordner vom Benutzer zugänglich sein, außerdem benötigte ich Templates für einige meiner HTML-Dateien, damit gemeinsamer HTML-Code in das Template eingefügt und wiederverwendet werden konnte. So habe ich beide zusammen erreicht:

from flask import Flask, request, render_template
from flask.json import JSONEncoder

app = Flask(__name__, template_folder='static')

@app.route('/')
def serve_static_file(path):
    # In meinem Fall enthalten nur HTML-Dateien den Vorlagen-Code wie Include.
    if path.endswith('.html'):
        return render_template(path)
    # Alle anderen Dateien werden direkt aus dem statischen Ordner bereitgestellt.
    return app.send_static_file(path)

Und alle meine Dateien sind im statischen Ordner gespeichert, der parallel zur Haupt-Flask-Datei liegt.

Bildbeschreibung hier eingeben

-3voto

Zum Beispiel habe ich folgendes verwendet, um eine Adsense-Datei zurückzugeben:

@app.route('/ads.txt')
def send_adstxt():
    return send_from_directory(app.static_folder, 'ads.txt')

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