To zawstydzające. Mam aplikację, w którą włączyłem Flask
i na razie obsługuje ona tylko jedną statyczną stronę HTML z linkami do CSS i JS. I nie mogę znaleźć, gdzie w dokumentacji Flask
opisuje się zwracanie plików statycznych. Tak, mógłbym użyć, render_template
ale wiem, że dane nie są szablonowane. Myślałbym send_file
lub url_for
był słuszny, ale nie mogłem zmusić ich do działania. W międzyczasie otwieram pliki, czytam zawartość i przygotowuję Response
odpowiedni typ mimetalu:
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)
Ktoś chce podać do tego przykładowy kod lub adres URL? Wiem, że to będzie bardzo proste.
python
flask
static-files
Hughdbrown
źródło
źródło
Odpowiedzi:
Preferowaną metodą jest użycie nginx lub innego serwera WWW do obsługi plików statycznych; będą w stanie to zrobić wydajniej niż Flask.
Możesz jednak użyć
send_from_directory
do wysłania plików z katalogu, co może być dość wygodne w niektórych sytuacjach:Czy nie używać
send_file
lubsend_static_file
ze ścieżką przez użytkownika.send_static_file
przykład:źródło
send_from_directory
ma na celu rozwiązanie tego problemu bezpieczeństwa. Istnieje możliwość błędu, jeśli ścieżka prowadzi do określonego katalogu.<path>
jest to równoważne<string:path>
, a ponieważ chcesz, aby Flask zapewniał parametr podobny do ścieżki, o który prosisz<path:path>
.Jeśli chcesz tylko przenieść lokalizację plików statycznych, najprostszą metodą jest zadeklarowanie ścieżek w konstruktorze. W poniższym przykładzie przeniosłem moje szablony i pliki statyczne do podfolderu o nazwie
web
.static_url_path=''
usuwa poprzednią ścieżkę z adresu URL (tj. domyślną/static
).static_folder='web/static'
aby wyświetlać pliki znalezione w folderzeweb/static
jako pliki statyczne.template_folder='web/templates'
podobnie zmienia to folder szablonów.Przy użyciu tej metody następujący adres URL zwróci plik CSS:
I na koniec, oto skrót struktury folderów, gdzie
flask_server.py
jest instancja Flask:źródło
get_static_file('index.html')
?Możesz także - i to jest moje ulubione - ustawić folder jako ścieżkę statyczną, aby pliki wewnątrz były dostępne dla wszystkich.
Za pomocą tego zestawu możesz używać standardowego kodu HTML:
źródło
project/static/style.css
dostępny plik .Jestem pewien, że znajdziesz tam to, czego potrzebujesz: http://flask.pocoo.org/docs/quickstart/#static-files
Zasadniczo potrzebujesz tylko „statycznego” folderu w katalogu głównym pakietu, a następnie możesz użyć
url_for('static', filename='foo.bar')
lub bezpośrednio połączyć się z plikami za pomocą http://example.com/static/foo.bar .EDYCJA : Jak sugerowano w komentarzach, możesz bezpośrednio użyć
'/static/foo.bar'
ścieżki URL, ALEurl_for()
narzut (pod względem wydajności) jest dość niski, a użycie go oznacza, że będziesz mógł później łatwo dostosować zachowanie (zmień folder, zmień ścieżkę URL, przenieś swoje pliki statyczne do S3 itp.).źródło
'/static/foo.bar'
bezpośrednio?Możesz użyć tej funkcji:
źródło
send_static_file
po wprowadzeniu przez użytkownika. Nie używaj tego rozwiązania do niczego ważnego.Używam (i działa świetnie) katalogu „szablony” i katalogu „statycznego”. Wszystkie moje pliki .html / szablony kolby umieszczam w katalogu szablonów, a statyczny zawiera CSS / JS. Render_template działa dobrze dla ogólnych plików HTML zgodnie z moją wiedzą, niezależnie od tego, w jakim stopniu użyłeś składni szablonów Flask. Poniżej znajduje się przykładowe wywołanie w moim pliku views.py.
Upewnij się tylko, że używasz url_for (), jeśli chcesz odwoływać się do jakiegoś pliku statycznego w oddzielnym katalogu statycznym. Prawdopodobnie i tak to zrobisz w linkach do plików CSS / JS w html. Na przykład...
Oto link do „kanonicznego” nieformalnego samouczka Flask - tutaj znajdziesz wiele świetnych wskazówek, które pomogą Ci zejść na ziemię.
http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
źródło
Najprostszym działającym przykładem opartym na innych odpowiedziach jest:
Z kodem HTML o nazwie index.html :
WAŻNE: A index.html w folderze o nazwie statyczne , czyli
<projectpath>
ma.py
plik i<projectpath>\static
mahtml
pliku.Jeśli chcesz, aby serwer był widoczny w sieci, użyj
app.run(debug=True, host='0.0.0.0')
EDYCJA: Aby wyświetlić wszystkie pliki w folderze na żądanie, użyj tego
Która jest zasadniczo
BlackMamba
odpowiedzią, więc daj im głos.źródło
Dla przepływu kątowego + kształtki kotła, który tworzy drzewo kolejnych folderów:
Korzystam z następującego rozwiązania:
Pomaga przedefiniować folder „statyczny” na niestandardowy.
źródło
Więc sprawiłem, że wszystko działało (na podstawie odpowiedzi @ user1671599) i chciałem się z wami podzielić.
(Mam nadzieję, że robię to dobrze, ponieważ jest to moja pierwsza aplikacja w Pythonie)
Ja to zrobiłem -
Struktura projektu:
server.py:
AppStarter.py:
źródło
Jeden z prostych sposobów. Twoje zdrowie!
demo.py
Teraz utwórz nazwę folderu o nazwie szablony . Dodaj plik index.html do folderu szablonów
index.html
Struktura projektu
źródło
render_template
rozwiązania, ale nie chciałem tego robić, ponieważ plik był statyczny bez żadnych zamian: „Tak, mógłbym użyć render_template, ale wiem, że dane nie są szablonowane”.Pomysł dzielenia się ... tym przykładem.
Działa to lepiej i prosto.
źródło
Użyj
redirect
iurl_for
To serweruje wszystkie pliki (css i js ...), do których odwołuje się twój HTML.
źródło
Najprostszym sposobem jest utworzenie folderu statycznego w głównym folderze projektu. Folder statyczny zawierający pliki .css.
główny folder
Obraz głównego folderu zawierającego foldery statyczne i szablony oraz skrypt kolby
kolba
HTML (układ)
HTML
źródło
Jeśli masz szablony w katalogu głównym, umieszczenie app = Flask ( nazwa ) będzie działać, jeśli plik, który ją zawiera, również znajduje się w tej samej lokalizacji, jeśli ten plik znajduje się w innej lokalizacji, musisz określić lokalizację szablonu, aby włączyć Kolba, aby wskazać lokalizację
źródło
Wszystkie odpowiedzi są dobre, ale dla mnie dobrze działała tylko prosta funkcja
send_file
Flask. Działa to dobrze, gdy wystarczy wysłać plik HTML jako odpowiedź, gdy host: port / ApiName wyświetli dane wyjściowe pliku w przeglądarceźródło
Domyślnie kolba użyciu folderu „Szablony” zawiera wszystkie pliki szablonu (dowolny plik zwykły tekst, ale zwykle
.html
albo jakiś język szablonów, takich jak jinja2) i folder „statyczny”, aby zawierać wszystkie pliki statyczne (tzn.js
.css
i twoje obrazy).W twoim
routes
, możesz użyćrender_template()
do renderowania pliku szablonu (jak mówię powyżej, domyślnie jest on umieszczony wtemplates
folderze) jako odpowiedź na twoje żądanie. A w pliku szablonu (zwykle jest to plik podobny do .html), możesz użyć niektórych.js
plików i / lub `.css ', więc myślę, że twoje pytanie dotyczy sposobu połączenia tych plików statycznych z bieżącym plikiem szablonu.źródło
Jeśli tylko próbujesz otworzyć plik, możesz użyć
app.open_resource()
. Czytanie pliku wyglądałoby więc mniej więcej takźródło