2010-11-21 8 views
79

Gibt es eine clevere Lösung zum Speichern statischer Dateien im Flask-Stammverzeichnis der Anwendung? robots.txt und sitemap.xml erwartet in/zu finden ist, so meine Idee war Routen für sie zu schaffen:Statische Dateien in Flask - robot.txt, sitemap.xml (mod_wsgi)

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

Es bequem etwas mehr sein muss :)

Antwort

60

der beste Weg ist static_url_path root url

from flask import Flask 

app = Flask(__name__, static_folder='static', static_url_path='') 
+2

Dies war die eine, die für statische Dateien arbeitete, Danke. +1 –

+0

Es ist erwähnenswert, dass der static_folder nicht im Projektordner sein muss. z.B. static_folder = '/ app/ui' ist in Ordnung. – ashic

15

Serving statische Dateien hat nichts mit Anwendungen zu tun, die dynamische Inhalte liefern sollen. Die korrekte Methode zum Bereitstellen von statischen Dateien hängt davon ab, welchen Server Sie verwenden. Wenn Sie Ihre App zum Laufen gebracht haben, müssen Sie sie an einen Webserver binden. Ich kann nur für Apache httpd sprechen, also ist die Art der Bereitstellung von statischen Dateien im virtuellen Host definiert, den Sie über mod-wsgi an Ihre Anwendung binden. Hier ist die Anleitung, die zeigen Sie, wie Sitemaps dienen, robots.txt oder statischen Inhalt: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

+0

einzustellen das ist die Antwort, die ich gesucht haben.Vielen Dank! – biesiad

+1

Eine Anwendung soll Inhalte, einige dynamische und einige statische liefern. –

65

@vonPetrushev richtig ist, in der Produktion sollten Sie statische Dateien über nginx oder Apache dienen, aber für die Entwicklung Es ist schön, dass Ihre Entwicklungsumgebung einfach ist und Ihre Python-App auch den statischen Inhalt bereitstellt, so dass Sie sich keine Sorgen über die Änderung von Konfigurationen und mehreren Projekten machen müssen. Um dies zu tun, möchten Sie die SharedDataMiddleware verwenden.

In diesem Beispiel wird davon ausgegangen, dass sich Ihre statischen Dateien im Ordner "static" befinden, passen Sie sie an, was auch immer zu Ihrer Umgebung passt.

+0

DANKE! Das habe ich gebraucht! Ich suche das für meine Produktion heroku. Sehen Sie die Antworten auf den folgenden Thread: http://flask.pocoo.org/mailinglist/archive/2012/2/22/flask-on-heroku-%2B-gunicorn-static-files/#20ff50d1dac06bf228b38d62ab11c6a9 – David

+0

Dies ist sehr sehr schöner Tipp! –

+2

Heads-up - es gibt jetzt einen einfacheren Weg, damit umzugehen. Überprüfen Sie meine Antwort. –

3

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

Dynamische Web-Anwendungen benötigen statische als auch Dateien. Das ist normalerweise, wo die CSS- und JavaScript-Dateien kommen. Idealerweise ist Ihr Webserver konfiguriert, um sie für Sie zu bedienen, aber während der Entwicklung kann Flask auch tun. Erstellen Sie einfach einen Ordner statisch genannt in Ihrem Paket oder nächste zu Ihrem Modul und es wird unter/statisch auf der Anwendung sein.

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

Die Datei:

Um URLs zu diesem Teil der URL, verwenden Sie die spezielle 'static' URL Namen zu erzeugen muss auf dem Dateisystem als static/style.css gespeichert werden.

5

Dies könnte hinzugefügt wurden, da diese Frage gestellt wurde, aber ich war auf der Suche durch „helpers.py“ der Kolben und ich fand flask.send_from_directory:

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. 
''' 

... die flask.send_file verweist :

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

..., die für eine bessere Kontrolle besser scheint, obwohl send_from_directory ** Optionen direkt über geht auf send_file.

0

Ich habe das gleiche Dilemma als auch.Habe einige Suche und fand meine Antwort (MHO):

als auch aus der Dokumentation

statische Dateien Dynamische Web-Anwendungen benötigen auch zitieren könnte. Das ist normalerweise wo die CSS- und JavaScript-Dateien herkommen. Idealerweise ist Ihr Webserver so konfiguriert, dass er sie für Sie bereitstellt, aber während der Entwicklung kann Flask das auch tun. Erstellen Sie einfach einen Ordner mit dem Namen "statisch" in Ihrem Paket oder neben Ihrem Modul, und dieser steht unter/static für die Anwendung zur Verfügung.

IMHO: Wenn die Anwendung bis zur Produktion ist, statische Datei Portion sein sollte (oder idealerweise) konfiguriert auf dem Webserver (nginx, Apache); aber während Entwicklung, machte Flask es verfügbar, statische Dateien zu dienen. Dies soll Ihnen helfen, sich schnell zu entwickeln - keine Notwendigkeit, Webserver einzurichten.

Ich hoffe, es hilft.

13

Eine weitere Möglichkeit, statische Dateien zu senden ist eine Catch-All-Regel wie folgt 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 dies das Set-up zu minimieren, um zu versuchen verwende bei der Entwicklung. Ich habe die Idee von http://flask.pocoo.org/snippets/57/

Weiter, ich bin mit der Verwendung von Kolben auf meinem Standalone-Maschine, aber mit Apache in Produktion Server bereitstellen. Ich benutze:

+1

Heads-up - es gibt jetzt einen einfacheren Weg, damit umzugehen. Überprüfen Sie meine Antwort. –

+0

Ausgezeichnete Möglichkeit, wenn Sie mehrere Wege bedienen müssen! –

21

Obwohl dies eine alt beantwortet Frage ist, beantworte ich dies, weil dieser Beitrag ziemlich hoch in den Google-Ergebnissen kommt. Obwohl es in der Dokumentation nicht behandelt wird, wenn Sie the API docs für den Flask Application-Objektkonstruktor lesen, ist es abgedeckt. Durch die Übergabe der benannten Parameter 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, wo statische Dateien aus bedient werden. Ebenso können Sie eine template_folder, den Namen von Ihnen static_url_path definieren.

+0

Ausgezeichnet! Ich denke, der Weg zu den statischen Dateien ist dann immernoch/static/.... – chmike

+0

@chmike Ja, es ist standardmäßig '/ static', aber Sie können das ändern, indem Sie' static_url_path' überschreiben. –

+0

Das ist richtig, aber andere Antworten sind flexibler. Dieser ist dadurch limitiert, dass er nur einen Verzeichnispfad bedienen kann. –

53

Die sauberste Antwort auf diese Frage ist die answer dazu (identischen) question:

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:]) 

Fassen wir zusammen:

  • als David wies darauf hin, mit der richtigen Konfiguration ist es ok to serve a few static files through prod
  • Die Suche nach /robots.txt sollte nicht zu einer Umleitung zu /static/robots.txt führen. (. In Seans beantworten, es ist nicht sofort klar, wie das erreicht wird)
  • es nicht sauber ist statische Dateien in die App Stammordner
  • schließlich hinzufügen, sieht die vorgeschlagene Lösung viel sauberer als die Zugabe von Middleware-Ansatz:
Verwandte Themen