Jadi ini memalukan. Saya punya aplikasi yang saya lempar bersama Flask
dan untuk saat ini hanya melayani satu halaman HTML statis dengan beberapa tautan ke CSS dan JS. Dan saya tidak dapat menemukan di mana dalam dokumentasi Flask
menjelaskan pengembalian file statis. Ya, saya bisa menggunakan render_template
tetapi saya tahu datanya tidak templatized. Saya telah memikirkan send_file
atau url_for
hal yang benar, tetapi saya tidak bisa membuatnya bekerja. Sementara itu, saya membuka file, membaca konten, dan memasang tipe Response
mimet yang sesuai:
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)
Seseorang ingin memberikan contoh kode atau url untuk ini? Saya tahu ini akan sangat sederhana.
python
flask
static-files
hughdbrown
sumber
sumber
Jawaban:
Metode yang disukai adalah menggunakan nginx atau server web lain untuk menyajikan file statis; mereka akan dapat melakukannya dengan lebih efisien daripada Flask.
Namun, Anda dapat menggunakan
send_from_directory
untuk mengirim file dari direktori, yang bisa sangat nyaman dalam beberapa situasi:Jangan tidak menggunakan
send_file
atausend_static_file
dengan jalur yang disediakan pengguna.send_static_file
contoh:sumber
send_from_directory
dirancang untuk mengatasi masalah keamanan itu. Itu ada untuk kesalahan jika jalan mengarah ke luar direktori tertentu.<path>
setara dengan<string:path>
, dan karena Anda ingin Flask memastikan parameter seperti jalur yang Anda minta<path:path>
.Jika Anda hanya ingin memindahkan lokasi file statis Anda, maka metode paling sederhana adalah dengan mendeklarasikan path di konstruktor. Pada contoh di bawah, saya telah pindah template saya dan file statis menjadi sub-folder bernama
web
.static_url_path=''
menghapus semua jalur sebelumnya dari URL (yaitu default/static
).static_folder='web/static'
untuk melayani file yang ditemukan dalam folderweb/static
sebagai file statis.template_folder='web/templates'
sama halnya, ini mengubah folder templat.Dengan menggunakan metode ini, URL berikut akan mengembalikan file CSS:
Dan akhirnya, inilah snap dari struktur folder, di mana
flask_server.py
instance Flask:sumber
get_static_file('index.html')
?Anda juga dapat, dan ini adalah favorit saya, mengatur folder sebagai jalur statis sehingga file di dalamnya dapat dijangkau oleh semua orang.
Dengan set itu Anda dapat menggunakan HTML standar:
sumber
project/static/style.css
tersedia.Saya yakin Anda akan menemukan yang Anda butuhkan di sana: http://flask.pocoo.org/docs/quickstart/#static-files
Pada dasarnya Anda hanya perlu folder "statis" di root paket Anda, dan kemudian Anda dapat menggunakan
url_for('static', filename='foo.bar')
atau langsung menautkan ke file Anda dengan http://example.com/static/foo.bar .EDIT : Seperti yang disarankan dalam komentar Anda dapat langsung menggunakan
'/static/foo.bar'
jalur URL TETAPIurl_for()
overhead (kinerja bijaksana) cukup rendah, dan menggunakannya berarti Anda akan dapat dengan mudah menyesuaikan perilaku setelahnya (mengubah folder, mengubah jalur URL, pindahkan file statis Anda ke S3, dll).sumber
'/static/foo.bar'
langsung?Anda dapat menggunakan fungsi ini:
sumber
send_static_file
dengan input pengguna. Jangan gunakan solusi ini dalam hal yang penting.Apa yang saya gunakan (dan sudah berfungsi dengan baik) adalah direktori "templat" dan direktori "statis". Saya menempatkan semua file .html / templat termos saya di dalam direktori templat, dan statis berisi CSS / JS. render_template berfungsi dengan baik untuk file html generik sepengetahuan saya, terlepas dari sejauh mana Anda menggunakan sintaks templating Flask. Di bawah ini adalah contoh panggilan dalam file views.py saya.
Pastikan Anda menggunakan url_for () ketika Anda ingin mereferensikan beberapa file statis di direktori statis terpisah. Anda mungkin akhirnya akan melakukan ini di tautan file CSS / JS dalam html. Contohnya...
Berikut ini tautan ke tutorial Labu informal "kanonik" - banyak kiat bagus di sini untuk membantu Anda memulai.
http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
sumber
Contoh kerja paling sederhana berdasarkan jawaban lain adalah sebagai berikut:
Dengan HTML disebut index.html :
PENTING: Dan index.html ada dalam folder bernama statis , artinya
<projectpath>
punya.py
file, dan<projectpath>\static
punyahtml
file.Jika Anda ingin server terlihat di jaringan, gunakan
app.run(debug=True, host='0.0.0.0')
EDIT: Untuk menampilkan semua file dalam folder jika diminta, gunakan ini
Yang pada dasarnya adalah
BlackMamba
jawaban, jadi beri mereka suara positif.sumber
Untuk aliran sudut + boilerplate yang membuat pohon folder berikutnya:
Saya menggunakan solusi berikut:
Ini membantu untuk mendefinisikan kembali folder 'statis' untuk custom.
sumber
Jadi saya dapat pekerjaan (berdasarkan jawaban @ user1671599) dan ingin membaginya dengan kalian.
(Saya harap saya melakukannya dengan benar karena ini adalah aplikasi pertama saya di Python)
Saya melakukan ini -
Struktur proyek:
server.py:
AppStarter.py:
sumber
Salah satu cara sederhana untuk dilakukan. Bersulang!
demo.py
Sekarang buat nama folder yang disebut templates . Tambahkan file index.html Anda di dalam folder template
index.html
Struktur Proyek
sumber
render_template
solusinya tetapi tidak ingin melakukannya karena file itu statis tanpa penggantian: "Ya, saya bisa menggunakan render_template tetapi saya tahu datanya tidak templatized."Berpikir untuk berbagi .... contoh ini.
Ini berfungsi lebih baik dan sederhana.
sumber
Gunakan
redirect
danurl_for
Server ini semua file (css & js ...) dirujuk dalam html Anda.
sumber
Cara paling sederhana adalah membuat folder statis di dalam folder proyek utama. Folder statis yang berisi file .css.
folder utama
Gambar folder utama yang berisi folder templat dan statis serta skrip flask
labu
html (tata letak)
html
sumber
Jika Anda memiliki template di direktori root Anda, menempatkan aplikasi = Labu ( nama ) akan berfungsi jika file yang berisi ini juga berada di lokasi yang sama, jika file ini di lokasi lain, Anda harus menentukan lokasi template untuk mengaktifkan Labu untuk menunjuk ke lokasi
sumber
Semua jawaban baik tetapi apa yang bekerja dengan baik bagi saya hanya menggunakan fungsi sederhana
send_file
dari Flask. Ini berfungsi dengan baik ketika Anda hanya perlu mengirim file html sebagai respons ketika host: port / ApiName akan menampilkan output file di browsersumber
Secara default, labu menggunakan folder "templat" untuk memuat semua file templat Anda (file teks biasa, tetapi biasanya
.html
atau semacam bahasa templat seperti jinja2) & folder "statis" untuk memuat semua file statis Anda (mis..js
.css
Dan gambar Anda).Di Anda
routes
, Anda dapat menggunakanrender_template()
untuk merender file template (seperti yang saya katakan di atas, secara default ditempatkan ditemplates
folder) sebagai respons untuk permintaan Anda. Dan dalam file template (biasanya file .html-like), Anda dapat menggunakan beberapa.js
dan / atau file .css, jadi saya kira pertanyaan Anda adalah bagaimana Anda menautkan file-file statis ini ke file template saat ini.sumber
Jika Anda hanya mencoba membuka file, Anda bisa menggunakannya
app.open_resource()
. Jadi membaca file akan terlihat seperti itusumber