So stellen Sie statische Dateien in Flask bereit
P粉754473468
P粉754473468 2023-08-23 15:50:41
0
2
560
<p>Das ist also peinlich. Ich habe eine App in <code>Flask</code> erstellt und sie stellt derzeit nur eine statische HTML-Seite mit einigen Links zu CSS und JS bereit. Ich kann in der Dokumentation für <code>Flask</code> keine Stelle finden, die die Rückgabe statischer Dateien beschreibt. Ja, ich kann <code>render_template</code> verwenden, aber ich weiß, dass die Daten nicht als Vorlage vorliegen. Ich denke, <code>send_file</code> oder <code>url_for</code> sind korrekt, aber ich kann sie nicht zum Laufen bringen. In der Zwischenzeit öffne ich die Datei, lese den Inhalt und stelle die <code>Response</code> mit dem entsprechenden Mimetyp ein: </p> <pre class="brush:php;toolbar:false;">import os.path aus Kolben importieren Kolben, Antwort 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 versuchen: src = os.path.join(root_dir(), Dateiname) # Finden Sie heraus, wie Flask statische Dateien zurückgibt #Versucht: # - render_template # - Datei senden # Das sollte nicht so offensichtlich sein return open(src).read() außer IOError als exc: Rückgabe str(exc) @app.route('/', methoden=['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)</pre> <p>Möchte jemand ein Codebeispiel oder eine URL dafür bereitstellen? Ich wusste, dass es sehr einfach sein würde. </p>
P粉754473468
P粉754473468

Antworte allen(2)
P粉155551728

如果您只想移动静态文件的位置,那么最简单的方法是在构造函数中声明路径。在下面的示例中,我已将模板和静态文件移动到名为 web 的子文件夹中。

app = Flask(__name__,
            static_url_path='', 
            static_folder='web/static',
            template_folder='web/templates')
  • static_url_path='' 从 URL 中删除所有前面的路径。
  • static_folder='web/static' 提供在文件夹中找到的任何文件 web/static 作为静态文件。
  • template_folder='web/templates' 类似地,这会更改 模板文件夹。

使用此方法,以下 URL 将返回 CSS 文件:

<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">

最后,这是文件夹结构的快照,其中 flask_server.py 是 Fl​​ask 实例:

P粉212971745

在生产中,在应用程序前面配置 HTTP 服务器(Nginx、Apache 等),以处理来自静态文件夹的 /static 请求。专用 Web 服务器非常擅长高效地提供静态文件,尽管在低容量时您可能不会注意到与 Flask 相比的差异。

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

您还可以使用 send_from_directory 来提供文件从您自己的路线中的目录中。这需要一个基本目录和一个路径,并确保该路径包含在该目录中,这样可以安全地接受用户提供的路径。如果您想在提供文件之前检查某些内容,例如登录用户是否具有权限,这可能很有用。

from flask import send_from_directory

@app.route('/reports/<path:path>')
def send_report(path):
    return send_from_directory('reports', path)

请勿send_filesend_static_file 与用户提供的路径一起使用。这将使您面临目录遍历攻击send_from_directory 旨在安全地处理已知目录下用户提供的路径,如果路径尝试转义该目录,则会引发错误。

如果您在内存中生成文件而不将其写入文件系统,则可以将 BytesIO 对象传递给 send_file 将其作为文件提供。在这种情况下,您需要将其他参数传递给 send_file,因为它无法推断文件名或内容类型等内容。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage