本地 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
是什么? <path:filename>
也应该按原样使用还是应该将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 实例中有多个静态路径的主要内容,如果未能解决你的问题,请参考以下文章