webentwicklung-frage-antwort-db.com.de

Statische Dateien in Flask - robot.txt, sitemap.xml (mod_wsgi)

Gibt es eine clevere Lösung, um statische Dateien im Anwendungsstammverzeichnis von Flask zu speichern? Es wird erwartet, dass robots.txt und sitemap.xml in/zu finden sind. Daher war meine Idee, Routen für sie zu erstellen:

@app.route('/sitemap.xml', methods=['GET'])
def sitemap():
  response = make_response(open('sitemap.xml').read())
  response.headers["Content-type"] = "text/plain"
  return response

Es muss etwas Bequemeres geben :)

89
biesiad

Am besten setzen Sie static_url_path auf root url

from flask import Flask

app = Flask(__name__, static_folder='static', static_url_path='')
71
dns

@vonPetrushev ist richtig, in der Produktion möchten Sie statische Dateien über Nginx oder Apache bereitstellen, aber für die Entwicklung ist es schön, wenn Ihre Entwicklungsumgebung einfach ist und Ihre python App den statischen Inhalt als bereitstellt Sie müssen sich also nicht um das Ändern von Konfigurationen und mehreren Projekten kümmern. Verwenden Sie dazu die SharedDataMiddleware .

from flask import Flask
app = Flask(__name__)
'''
Your app setup and code
'''
if app.config['DEBUG']:
    from werkzeug import SharedDataMiddleware
    import os
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
      '/': os.path.join(os.path.dirname(__file__), 'static')
    })

In diesem Beispiel wird davon ausgegangen, dass sich Ihre statischen Dateien im Ordner "static" befinden. Passen Sie sie an Ihre Umgebung an.

65
Philip Southam

Die sauberste Antwort auf diese Frage ist die Antwort zu dieser (identischen) Frage :

from flask import Flask, request, send_from_directory
app = Flask(__name__, static_folder='static')    

@app.route('/robots.txt')
@app.route('/sitemap.xml')
def static_from_root():
    return send_from_directory(app.static_folder, request.path[1:])

Zusammenfassen:

  • wie David betonte, ist es mit der richtigen Konfiguration ok, um ein paar statische Dateien über prod bereitzustellen
  • das Suchen nach /robots.txt sollte nicht zu einer Umleitung nach /static/robots.txt führen. (In Seans Antwort ist nicht sofort klar, wie das erreicht wird.)
  • es ist nicht sauber, statische Dateien zum App-Stammordner hinzuzufügen
  • schließlich sieht die vorgeschlagene Lösung viel sauberer aus als der Ansatz des Hinzufügens von Middleware:
56
bebbi

Auch wenn dies eine alte beantwortete Frage ist, beantworte ich sie, da dieser Beitrag in den Google-Ergebnissen ziemlich weit oben steht. Wenn Sie die API-Dokumentation für den Anwendungsobjektkonstruktor Flask Application object constructor lesen, wird dies zwar in der Dokumentation nicht behandelt. Durch Übergabe des benannten Parameters static_folder wie so:

from flask import Flask
app = Flask(__name__,
            static_folder="/path/to/static",
            template_folder="/path/to/templates")

... können Sie festlegen, woher statische Dateien geliefert werden. Ebenso können Sie ein template_folder, der Name von dir static_url_path.

21

Das Bereitstellen statischer Dateien hat nichts mit Anwendungen zu tun, die dynamische Inhalte bereitstellen sollen. Die richtige Art der Bereitstellung statischer Dateien hängt davon ab, welchen Server Sie verwenden. Wenn Sie Ihre App zum Laufen bringen, müssen Sie sie schließlich an einen Webserver binden. Ich kann nur für Apache httpd sprechen, daher ist die Art und Weise, wie statische Dateien bereitgestellt werden, auf dem virtuellen Host definiert, den Sie über mod-wsgi an Ihre Anwendung binden. In der folgenden Anleitung erfahren Sie, wie Sitemaps, robots.txt oder statische Inhalte bereitgestellt werden: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

15
vonPetrushev

Eine andere Möglichkeit, statische Dateien zu senden, besteht darin, eine Sammelregel wie die folgende zu verwenden:

@app.route('/<path:path>')
def catch_all(path):
    if not app.debug:
        flask.abort(404)
    try:
        f = open(path)
    except IOError, e:
        flask.abort(404)
        return
    return f.read()

Ich benutze dies, um das Setup beim Entwickeln zu minimieren. Ich habe die Idee von http://flask.pocoo.org/snippets/57/

Außerdem entwickle ich mit flask auf meinem eigenständigen Computer, aber mit Apache auf dem Produktionsserver. Ich verwende:

file_suffix_to_mimetype = {
    '.css': 'text/css',
    '.jpg': 'image/jpeg',
    '.html': 'text/html',
    '.ico': 'image/x-icon',
    '.png': 'image/png',
    '.js': 'application/javascript'
}
def static_file(path):
    try:
        f = open(path)
    except IOError, e:
        flask.abort(404)
        return
    root, ext = os.path.splitext(path)
    if ext in file_suffix_to_mimetype:
        return flask.Response(f.read(), mimetype=file_suffix_to_mimetype[ext])
    return f.read()

[...]

if __== '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-d', '--debug', dest='debug', default=False,
                      help='turn on Flask debugging', action='store_true')

    options, args = parser.parse_args()

    if options.debug:
        app.debug = True
        # set up flask to serve static content
        app.add_url_rule('/<path:path>', 'static_file', static_file)
    app.run()
14
Ben Golding

Dies könnte hinzugefügt worden sein, seit diese Frage gestellt wurde, aber ich habe flask's "helpers.py" durchgesehen und flask.send_from_directory gefunden:

send_from_directory(directory, filename, **options)
'''
  send_from_directory(directory, filename, **options)
  Send a file from a given directory with send_file.  This
  is a secure way to quickly expose static files from an upload folder
  or something similar.
'''

... welche Referenzen flask.send_file:

send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False)

... was für mehr Kontrolle besser erscheint, obwohl send_from_directory ** -Optionen direkt an send_file weiterleitet.

6

Aus der Dokumentation hier: http://flask.pocoo.org/docs/quickstart/#static-files

Dynamische Webanwendungen benötigen ebenfalls statische Dateien. Hierher kommen normalerweise die CSS- und JavaScript-Dateien. Idealerweise ist Ihr Webserver so konfiguriert, dass er diese für Sie bereitstellt, aber während der Entwicklung kann Flask dies auch. Erstellen Sie einfach einen Ordner mit dem Namen static in Ihrem Paket oder neben Ihrem Modul und er ist in der Anwendung unter/static verfügbar.

Verwenden Sie den speziellen "statischen" URL-Namen, um URLs zu diesem Teil der URL zu generieren:

url_for ('static', filename = 'style.css')

Die Datei muss als static/style.css im Dateisystem gespeichert werden.

3
Josh Klein

Ich habe auch das gleiche Dilemma. Haben einige gesucht und meine Antwort gefunden (MHO):

Könnte auch aus der Dokumentation zitieren

Dynamische Webanwendungen benötigen ebenfalls statische Dateien. Hierher kommen normalerweise die CSS- und JavaScript-Dateien. Im Idealfall ist Ihr Webserver so konfiguriert, dass er diese für Sie bereitstellt, aber während der Entwicklung Flask kann das auch tun. Erstellen Sie einfach einen Ordner mit dem Namen static in Ihrem Paket oder neben Ihr Modul und es wird unter/static in der Anwendung verfügbar sein.

IMHO: Wenn Ihre Anwendung für Produktion läuft, sollte (oder ist idealerweise) die statische Dateibereitstellung auf dem Webserver (nginx, Apache) konfiguriert sein. aber während Entwicklung, Flask zur Verfügung gestellt, um statische Dateien bereitzustellen. Dies soll Ihnen helfen, sich schnell zu entwickeln - keine Notwendigkeit, Webserver und dergleichen einzurichten.

Ich hoffe es hilft.

0
jpanganiban