【发布时间】:2012-03-19 18:17:55
【问题描述】:
是否可以为我的本地开发 Flask 实例添加更多静态路径?
我希望有默认的static 文件夹来存储站点的 js/css/images 文件和另一个文件夹,例如designs 保留我的特定资产。如果有更好的解决方案,我不想将designs 文件夹放在static 中。
【问题讨论】:
是否可以为我的本地开发 Flask 实例添加更多静态路径?
我希望有默认的static 文件夹来存储站点的 js/css/images 文件和另一个文件夹,例如designs 保留我的特定资产。如果有更好的解决方案,我不想将designs 文件夹放在static 中。
【问题讨论】:
我一直在使用以下方法:
# 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 变量。
cdn 是什么? <path:filename> 也应该按原样使用还是应该将filename 替换为实际的文件名?
flask.send_from_directory 已经检查文件名没有指向目录之外。 werkzeug.utils.secure_filename 用于安全命名新文件,与此处无关。我实际上认为它可以通过例如删除目录、空格和变音符号来破坏事物。
您可以使用带有自己的静态目录的蓝图 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') }}
【讨论】:
如果我将图像存储在图像目录中,如下所示
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)
【讨论】:
对于任何想知道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 或您正在使用的任何服务器处理这种特殊情况,我只需要为开发环境设置此设置用于测试。
【讨论】: