Bagaimana untuk menyampaikan fail statik dalam Flask
P粉754473468
P粉754473468 2023-08-23 15:50:41
0
2
477

Jadi ini memalukan. Saya telah mengumpulkan apl dalam Flask dan pada masa ini ia hanya menyediakan halaman HTML statik dengan beberapa pautan ke CSS dan JS. Saya tidak dapat mencari tempat dalam dokumentasi untuk Flask Ya, saya boleh menggunakan render_template tetapi saya tahu data itu tidak templat. Saya rasa send_file atau url_for Sementara itu, saya membuka fail, membaca kandungan dan menetapkan Respons

import os.path daripada kelalang import Flask, Response app = Flask(__name__) app.config.from_object(__name__) def root_dir(): # pragma: tiada penutup kembalikan os.path.abspath(os.path.dirname(__file__)) def get_file(nama fail): # pragma: tiada penutup cuba: src = os.path.join(root_dir(), nama fail) # Fikirkan bagaimana kelalang mengembalikan fail statik #Mencuba: # - render_template # - hantar fail # Perkara ini sepatutnya tidak begitu jelas kembali buka(src).baca() kecuali IOError sebagai exc: kembali str(exc) @app.route('/', methods=['GET']) def metrics(): # pragma: tiada perlindungan kandungan = get_file('jenkins_analytics.html') kembali Respons(kandungan, mimetype="text/html") @app.route('/', defaults={'path': ''}) @app.route('/') def get_resource(path): # pragma: tiada perlindungan mimetypes = { ".css": "teks/css", ".html": "teks/html", ".js": "application/javascript", } complete_path = os.path.join(root_dir(), path) ext = os.path.splitext(path)[1] mimetype = mimetypes.get(ext, "text/html") kandungan = get_file(complete_path) kembali Respons (kandungan, mimetype=mimetype) jika __nama__ == '__utama__': # pragma: tiada penutup app.run(port=80)

Adakah sesiapa mahu memberikan sampel kod atau URL untuk ini? Saya tahu ia akan menjadi sangat mudah.

P粉754473468
P粉754473468

membalas semua (2)
P粉155551728

Jika anda hanya mahu mengalihkan lokasi fail statik anda, cara paling mudah ialah mengisytiharkan laluan dalam pembina. Dalam contoh di bawah, saya telah mengalihkan templat dan fail statik ke dalam subfolder bernamaweb.

app = Flask(__name__, static_url_path='', static_folder='web/static', template_folder='web/templates')
  • static_url_path=''Alih keluar semua laluan sebelumnya daripada URL.
  • static_folder='web/static'Menyajikan mana-mana fail yang terdapat dalam folderweb/staticSebagai fail statik.
  • template_folder='web/templates'Begitu juga, ini berubah Folder templat.

Menggunakan kaedah ini, URL berikut akan mengembalikan fail CSS:

Akhir sekali, berikut ialah petikan struktur folder, denganflask_server.pyialah contoh Flask:

    P粉212971745

    Dalam pengeluaran, konfigurasikan pelayan HTTP (Nginx, Apache, dll.) di hadapan aplikasi untuk mengendalikan/staticpermintaan daripada folder statik. Pelayan web yang berdedikasi sangat baik dalam menyediakan fail statik dengan cekap, walaupun pada volum yang rendah anda mungkin tidak dapat melihat perbezaannya berbanding dengan Flask.

    Flask secara automatik akan mencipta satu/static/ 路由,该路由将为 Python 旁边的static文件夹下的任何filename提供服务定义 Flask 应用程序的模块。使用url_for链接到静态文件:url_for('static', filename='js/analytics.js')

    Anda juga boleh menggunakansend_from_directoryuntuk menyampaikan fail daripada direktori dalam laluan anda sendiri. Ini mengambil direktori asas dan laluan, dan memastikan laluan itu terkandung dalam direktori itu supaya laluan yang dibekalkan pengguna boleh diterima dengan selamat. Ini boleh berguna jika anda ingin menyemak sesuatu sebelum menyampaikan fail, seperti sama ada pengguna log masuk mempunyai kebenaran.

    from flask import send_from_directory @app.route('/reports/') def send_report(path): return send_from_directory('reports', path)

    Jangangunakansend_fileatausend_static_filedengan laluan yang dibekalkan pengguna. Ini akan mendedahkan anda kepadaserangan traversal direktorisend_filesend_static_file与用户提供的路径一起使用。这将使您面临目录遍历攻击send_from_directory.

    Direka bentuk untuk mengendalikan laluan yang dibekalkan pengguna dengan selamat ke direktori yang diketahui, menimbulkan ralat jika laluan cuba melarikan diri daripada direktori.

    BytesIO对象传递给send_file将其作为文件提供。在这种情况下,您需要将其他参数传递给send_fileJika anda menjana fail dalam ingatan tanpa menulisnya ke sistem fail, anda boleh menghantar objekBytesIOkesend_file

    Sediakannya sebagai fail. Dalam kes ini, anda perlu menghantar parameter tambahan kepada send_filekerana ia tidak boleh membuat kesimpulan perkara seperti nama fail atau jenis kandungan.
      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!