Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 提供不带url前缀的蓝图中的静态文件_Python_Static Files_Flask - Fatal编程技术网

Python 提供不带url前缀的蓝图中的静态文件

Python 提供不带url前缀的蓝图中的静态文件,python,static-files,flask,Python,Static Files,Flask,对于开发,我希望提供blueprint静态文件夹中的静态文件。但是,我不想通过blueprint的url前缀加载所有文件。是否可以配置flask,使其在所有blueprint的静态文件夹中查找并返回找到的第一个文件? 这样做的原因是,当我部署应用程序时,构建过程将提取蓝图的所有文件,并将它们放在一个单独的文件夹中(类似于Django的collectstatics) 换句话说,我有两个蓝图:foo和bar: app +--- foo | +--- assets | |

对于开发,我希望提供blueprint静态文件夹中的静态文件。但是,我不想通过blueprint的url前缀加载所有文件。是否可以配置flask,使其在所有blueprint的静态文件夹中查找并返回找到的第一个文件? 这样做的原因是,当我部署应用程序时,构建过程将提取蓝图的所有文件,并将它们放在一个单独的文件夹中(类似于Django的collectstatics)

换句话说,我有两个蓝图:
foo
bar

app
  +--- foo
  |    +--- assets
  |    |     +--- css
  |    |     |
  |    |     +--- js
  |    +
  |    |
  |    +--- __init__.py:  foo_blueprint = Blueprint('foo', __name__, static_folder='assets')
  |
  +--- bar
       +
       |
       +--- __init__.py: bar_blueprint = Blueprint('bar', __name__, static_folder='assets')

我希望特定
js
子文件夹中的所有js文件都可以从url
/static/js/file.js
中获得。这可能吗?

您不能使用默认的
烧瓶
机制

在您的示例中,您将为静态文件夹创建3条规则:

Rule "/assets/<path:filename>" for "static" endpoint
Rule "/assets/<path:filename>" for "foo.static" endpoint
Rule "/assets/<path:filename>" for "bar.static" endpoint
本例不包括蓝图注册序列,因为它存储在dict中

但如果您有两个同名文件,则将处理第一个文件。例如,如果您有下一个结构:

/static
/static/app.js "console.log('app');"
/foo/static/app.js "console.log('foo app');"
/foo/static/blue.js "console.log('foo blue');"
/foo/static/foo.js "console.log('foo self');"
/bar/static/app.js "console.log('bar app');"
/bar/static/blue.js "console.log('foo blue');"
/bar/static/bar.js "console.log('bar self');"
并将脚本包括到页面:

<script src="{{ url_for('static', filename='app.js') }}"></script>
<script src="{{ url_for('foo.static', filename='app.js') }}"></script>
<script src="{{ url_for('bar.static', filename='app.js') }}"></script>
<script src="{{ url_for('foo.static', filename='blue.js') }}"></script>
<script src="{{ url_for('bar.static', filename='blue.js') }}"></script>
<script src="{{ url_for('foo.static', filename='foo.js') }}"></script>
<script src="{{ url_for('bar.static', filename='bar.js') }}"></script>
对于js和css,可以用相同的路径连接文件,但对于图像不能这样做


不过,我更喜欢为每个蓝图使用唯一的URL前缀,因为它与
URL\u for

非常简单,谢谢您的回复。您是否也在生产中从blueprint文件夹中提供这些服务?您是否使用类似于
require.js
r.js
优化的方法来合并js文件?如果是这样的话,如果你最终只有1个
js
文件,那么URL前缀是否也可以使用?我没有依赖静态文件的蓝图,但你可以尝试收集所有静态文件,并将其放入nginx或CDN进行生产。我现在不使用
require.js
,但我相信它可以很好地使用URL前缀作为开发模块。它可以很容易地收集和编译用于生产的模块,只需很少的脚本。+1就可以非常优雅地解决这个问题。注意那些关心的人-如果你需要确保每次都有相同的顺序,你可以对蓝图进行排序,这样在多个文件的情况下,查找结果总是相同的。可以肯定的是,顺序只是具有相同名称的js文件的问题,对吗?如果我有唯一的文件名,这不会是一个问题。是的。如果要将序列另存为blueprint registration order,则可以覆盖
Registrate\u blueprint
并存储此序列。或者您可以尝试按照上面的建议连接此文件。或引发异常以避免这种情况。
<script src="{{ url_for('static', filename='app.js') }}"></script>
<script src="{{ url_for('foo.static', filename='app.js') }}"></script>
<script src="{{ url_for('bar.static', filename='app.js') }}"></script>
<script src="{{ url_for('foo.static', filename='blue.js') }}"></script>
<script src="{{ url_for('bar.static', filename='blue.js') }}"></script>
<script src="{{ url_for('foo.static', filename='foo.js') }}"></script>
<script src="{{ url_for('bar.static', filename='bar.js') }}"></script>
app
app
app
foo blue (or bar blue)
foo blue (or bar blue)
foo self
bar self