P粉1555517282023-08-24 12:55:28
如果您只想移动静态文件的位置,那么最简单的方法是在构造函数中声明路径。在下面的示例中,我已将模板和静态文件移动到名为 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
是 Flask 实例:
P粉2129717452023-08-24 09:31:38
在生产中,在应用程序前面配置 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_file
或 send_static_file
与用户提供的路径一起使用。这将使您面临目录遍历攻击。 send_from_directory
旨在安全地处理已知目录下用户提供的路径,如果路径尝试转义该目录,则会引发错误。
如果您在内存中生成文件而不将其写入文件系统,则可以将 BytesIO
对象传递给 send_file
将其作为文件提供。在这种情况下,您需要将其他参数传递给 send_file
,因为它无法推断文件名或内容类型等内容。