本地 Flask 实例中有多个静态路径

Posted

技术标签:

【中文标题】本地 Flask 实例中有多个静态路径【英文标题】:More than one static path in local Flask instance 【发布时间】:2012-03-19 18:17:55 【问题描述】:

是否可以为我的本地开发 Flask 实例添加更多静态路径? 我希望有默认的static 文件夹来存储站点的 js/css/images 文件和另一个文件夹,例如designs 保留我的特定资产。如果有更好的解决方案,我不想将designs 文件夹放在static 中。

【问题讨论】:

【参考方案1】:

我一直在使用以下方法:

# Custom static data
@app.route('/cdn/<path:filename>')
def custom_static(filename):
    return send_from_directory(app.config['CUSTOM_STATIC_PATH'], filename)

CUSTOM_STATIC_PATH 变量在我的配置中定义。

在模板中:

 url_for('custom_static', filename='foo') 

买者自保 - 我不确定它是否安全 ;)

【讨论】:

在我看来这是最自定义的版本,但您应该使用werkzeug.utils.secure_filename 来检查文件名。 澄清任何人来'CUSTOM_STATIC_PATH'是我相信实际的文件夹名称路径。这不是一些特殊的键/变量....出于某种原因,我认为它是。 实际上,@Eiyrioü,我采取了另一种方式,也让它工作。我按原样使用代码,并在我的配置文件中添加了一个CUSTOM_STATIC_PATH 变量。 这里的cdn 是什么? &lt;path:filename&gt; 也应该按原样使用还是应该将filename 替换为实际的文件名? @Jarus: flask.send_from_directory 已经检查文件名没有指向目录之外。 werkzeug.utils.secure_filename 用于安全命名新文件,与此处无关。我实际上认为它可以通过例如删除目录、空格和变音符号来破坏事物。【参考方案2】:

您可以使用带有自己的静态目录的蓝图 http://flask.pocoo.org/docs/blueprints/

蓝图

blueprint = Blueprint('site', __name__, static_url_path='/static/site', static_folder='path/to/files')
app.register_blueprint(blueprint)

模板

 url_for('site.static', filename='filename') 

【讨论】:

【参考方案3】:

如果我将图像存储在图像目录中,如下所示

images/
  dir1/
    image1.jpg
  dir2/
    image2.jpg

然后我们可以使用以下 url 访问这些图像: http://localhost:5000/images/dir1/image1.jpg 在以下代码的帮助下

from flask import Flask, send_from_directory


app = Flask(__name__, static_folder='main_static_dir')


@app.route('/images/<path:filename>')
def base_static(filename):
    return send_from_directory(app.root_path + '/images/', filename)


if __name__ == '__main__':
    app.run(debug=True)

【讨论】:

【参考方案4】:

对于任何想知道app.config['CUSTOM_STATIC_PATH'] 被设置为什么的人,我想扩展上面已接受的答案。

在我的情况下,我需要一个 /.well-known 目录,所以这是我使用的:

我在我的应用根目录中放置了一个名为 well-known 的新目录。 我像这样设置了一个配置变量:

CUSTOM_STATIC_PATH=app.root_path + '/well-known/'

然后我就这样使用了这个变量:

@app.route('/.well-known/<path:filename>')
def wellKnownRoute(filename):
    return send_from_directory(app.config['CUSTOM_STATIC_PATH'], filename, conditional=True)

设置conditional=True 是聪明的,这将对文件不存在的任何请求进行404。

当然,如果您想知道为什么需要为 dir 路径设置配置值,那么您不需要。你总是可以只使用配置的值,而不是给你这个:

@app.route('/.well-known/<path:filename>')
def wellKnownRoute(filename):
    return send_from_directory(app.root_path + '/well-known/', filename, conditional=True)

我的/.well-known URL 路径文件总是来自应用程序根目录/well-known 目录,因此没有必要让它变得更复杂。

请注意,您最好通过设置额外的服务器块并从应用程序外部提供文件来从 nginx 或您正在使用的任何服务器处理这种特殊情况,我只需要为开发环境设置此设置用于测试。

【讨论】:

以上是关于本地 Flask 实例中有多个静态路径的主要内容,如果未能解决你的问题,请参考以下文章

Flask中的实例化配置

flask简

网站后端_Python+Flask.0009.FLASK静态资源之默认及自定义资源目录?

Flask相关配置参数

如何在 Java 静态块中创建本地类? [复制]

3. Flask 静态文件模板文件设置