Så dette er pinlig. Jeg har en applikasjon som jeg kastet sammen i Flask
, og foreløpig serverer den bare en enkelt statisk HTML-side med noen lenker til CSS og JS. Og jeg kan ikke finne hvor i dokumentasjonen Flask
beskriver å returnere statiske filer. Ja, jeg kunne bruke render_template
, men jeg vet at dataene ikke er templatisert. Jeg hadde trodd send_file
eller url_for
var det rette, men jeg fikk ikke disse til å fungere. I mellomtiden åpner jeg filene, leser innholdet og rigger opp en Response
med passende mimetype:
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)
# Figure out how flask returns static files
# Tried:
# - render_template
# - send_file
# This should not be so non-obvious
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('/<path:path>')
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)
Noen som vil gi et kodeeksempel eller url for dette? Jeg vet at dette kommer til å være veldig enkelt.
Den foretrukne metoden er å bruke nginx eller en annen webserver til å servere statiske filer; de vil kunne gjøre det mer effektivt enn Flask.
Du kan imidlertid bruke send_from_directory
for å sende filer fra en katalog, noe som kan være ganske praktisk i noen situasjoner:
from flask import Flask, request, send_from_directory
# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path='')
@app.route('/js/<path:path>')
def send_js(path):
return send_from_directory('js', path)
if __name__ == "__main__":
app.run()
Ikke bruk send_file
eller send_static_file
med en brukeroppgitt bane.
Eksempel på send_static_file
:
from flask import Flask, request
# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path='')
@app.route('/')
def root():
return app.send_static_file('index.html')
Jeg er sikker på at du finner det du trenger der: http://flask.pocoo.org/docs/quickstart/#static-files
I utgangspunktet trenger du bare en "statisk" mappe i roten av pakken din, og så kan du bruke "url_for('static', filename='foo.bar')` eller lenke direkte til filene dine med http://example.com/static/foo.bar.
EDIT: Som antydet i kommentarene kan du bruke '/static/foo.bar'
URL-banen MEN url_for()
overhead (ytelsesmessig) er ganske lav, og å bruke den betyr at du enkelt kan tilpasse oppførselen etterpå (endre mappen, endre URL-banen, flytte de statiske filene dine til S3, etc).
Det jeg bruker (og det har fungert bra) er en "maler" -katalog og en "statisk" -katalog. Jeg plasserer alle .html-filene / Flask-malene mine i malerkatalogen, og statisk inneholder CSS / JS. render_template fungerer bra for generiske html-filer så vidt jeg vet, uavhengig av i hvilken grad du brukte Flask&# 39s templating-syntaks. Nedenfor er et eksempelanrop i min views.py-fil.
@app.route('/projects')
def projects():
return render_template("projects.html", title = 'Projects')
Bare sørg for at du bruker url_for() når du vil referere til en statisk fil i den separate statiske katalogen. Du' vil sannsynligvis ende opp med å gjøre dette uansett i din CSS/JS fil linker i html. For eksempel...
<script src="{{ url_for('static', filename='styles/dist/js/bootstrap.js') }}"></script>
Her' er en lenke til den " kanoniske " uformelle Flask-opplæringen - mange gode tips her for å hjelpe deg med å komme i gang.
http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world