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.

10voto

Meenu Punkte 159

Standardmäßig enthält der Ordner "static" alle statischen Dateien. Hier ist ein Codebeispiel:

9voto

forzagreen Punkte 2115

Verwenden Sie redirect und url_for

from flask import redirect, url_for

@app.route('/', methods=['GET'])
def metrics():
    return redirect(url_for('static', filename='jenkins_analytics.html'))

Dies bedient alle Dateien (css & js...), die in Ihrem HTML referenziert sind.

7voto

Maheshvirus Punkte 5633

Einer der einfachsten Wege, dies zu tun. Prost!

demo.py

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

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

if __name__ == '__main__':
   app.run(debug = True)

Erstellen Sie jetzt einen Ordner namens templates. Fügen Sie Ihre Datei index.html in den Ordner templates ein.

index.html

    Webanwendung mit Python

            Begrüßt Sie!!

Projektstruktur

-demo.py
-templates/index.html

5voto

pbatey Punkte 939

Das Problem, das ich hatte, hing damit zusammen, dass index.html-Dateien nicht für Verzeichnisse bereitgestellt wurden, wenn static_url_path und static_folder verwendet wurden.

Hier ist meine Lösung:

import os
from flask import Flask, send_from_directory
from flask.helpers import safe_join

app = Flask(__name__)
static = safe_join(os.path.dirname(__file__), 'static')

@app.route('/')
def _home():
  return send_from_directory(static, 'index.html')

@app.route('/')
def _static(path):
  if os.path.isdir(safe_join(static, path)):
    path = os.path.join(path, 'index.html')
  return send_from_directory(static, path)

3voto

Jeevan Chaitanya Punkte 1055

Gedanke des Teilens.... dieses Beispiel.

from flask import Flask
app = Flask(__name__)

@app.route('/loading/')
def hello_world():
    data = open('sample.html').read()    
    return data

if __name__ == '__main__':
    app.run(host='0.0.0.0')

Dies funktioniert besser und ist einfacher.

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