【问题标题】:Flask blueprint looks for static file in blueprint instead of root directoryFlask 蓝图在蓝图中查找静态文件而不是根目录
【发布时间】:2018-03-10 18:14:59
【问题描述】:

我的蓝图应该在根目录中查找静态文件,但不是。

假设我有一个名为“前端”的蓝图。 'frontend' 只有 template_folder='frontend' 传入。

即使我将静态文件放在 /app/frontend/static/file.css 下,它也找不到。它也没有在 /app/static/file.css 中找到它。

控制台网络服务器每次都会为每个 css 或 js 静态文件显示“404”。

但是当我打印出 url_maps 时,我确实有这个显示:

<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])

我就这样启动了 register_blueprint('frontend')。

frontend = Blueprint('frontend', __name__,template_folder='templates')

我在视图中的索引返回:

return render_template('frontend.html', pagination=pagination)

frontend.html只能在/app/frontend/templates工作

如果您将frontend.html 放在/app/templates 上,它也不起作用。即使您删除了“template_folder”参数。

文件结构:

app
-app.py
--frontend
--frontend/templates  contains: (frontend.html) (base.html) (errors/404.html)
--static
--static/css (bootstrap.min.css) (what I want to grab with url_for inside base.html)

【问题讨论】:

    标签: python jinja2 flask


    【解决方案1】:

    1。模板

    每个烧瓶应用程序、蓝图和模块都有jinja_loader。当您的render_template 开始找到它之前在应用程序中找到的模板,然后在每个蓝图中(参见get_source_iter_loader),直到找不到第一个存在的文件。

    jinja_loader 从对象路径和模板文件夹名称构建,例如,如果您的应用程序、蓝图或模块在 /home/www/myapp (/usr/lib/python3.4/site-packages/myapp) 文件夹和 template 文件夹中,那么完整的模板文件夹将是 /home/www/myapp/template ( /usr/lib/python3.4/site-packages/myapp/template)。

    这意味着如果您在应用程序模板文件夹中有文件,那么即使您在蓝图中渲染模板,您也会渲染它。此外,如果您在应用程序模板文件夹中没有文件,但在蓝图中的任何文件中,它将被渲染。因此,对于蓝图,最好使用唯一的模板前缀以避免模板覆盖(falsk_admin - admin/ 模板前缀)。

    例如对于扩展,它有助于在包中使用模板,并且如果您需要它已经可以在您的应用程序中替换它(如果您只想继承,您需要为模板提供新名称)。

    2。网址规则

    规则没有任何蓝图前缀 - 在蓝图中,您只需连接前缀和规则,然后使用它。

    因此,所有 url 规则都将使用现有规则解决(请参阅另一个答案 https://stackoverflow.com/a/17146563/880326)。

    您可以拥有相同的 url 规则描述(/static/static)并且只有一个端点。

    3。静态文件

    对于应用程序默认存在静态文件夹。对于蓝图,您应该添加 static_folder 参数。但是如果两个规则都有相同的描述,那么默认情况下你不能从这两个规则中获取文件(little code 可以)。

    对于烧瓶应用程序、蓝图和模块完整的静态文件夹依赖形式root_path,它依赖于__name__ 参数。

    但是,如果您有没有 url 前缀的蓝图,最好设置另一个 static_url_path 以避免错误。

    【讨论】:

    • 我的意思是设计不是哲学上的,因此您可以从“根 /app/static”目录中“通用”静态文件,并从 /app/blueprint/static 文件夹中“共享”特定于蓝图的文件?默认情况下不应该检查两者,否则每个蓝图都会重复相同的文件?我认为它应该是标准的,它应该首先查看 ROOT 静态,然后查看蓝图的静态。
    • 有点不同意,因为蓝图更独立,例如,您可以使用使用 1.9.0 的 jquery.js 的管理模块和使用 2.0.0 的 jquery.js 的主应用程序。还有一些文件可以具有相同的名称,例如styles.css。只是我的意见:如果蓝图不使用应用程序静态,则为应用程序和蓝图使用不同的静态 URL。
    【解决方案2】:

    在创建Blueprint 时尝试添加static_folder='static'

    此外,您可以使用 jinja 中的url_for 函数打印出您的静态路径。

    {{ url_for(".static", filename="css/bootstrap.min.css") }}

    【讨论】:

    • 不,这不起作用。蓝图前端的视图仍然无法检测到 root-app /app/templates 文件夹中的模板。它还为任何静态文件提供 404。尽管有 ' (HEAD, OPTIONS, GET) -> static>, ' (HEAD, OPTIONS, GET) -> frontend.static>]) ... 是否存在某种路径、侦听或权限问题?
    • 这是针对标题的问题,静态和模板是两个不同的东西。如果按照我上面写的那样完成,静态文件应该可以工作。如果您在创建Blueprint 时删除了template_folder='templates',即使您另有说明,模板也应该可以工作。有关示例,请参见 github.com/Jahaja/psdash/tree/master/psdash
    • 我终于搞定了,显然对于静态文件,您需要在 static_url_path 中添加一个“/app”... frontend = Blueprint('frontend', name, template_folder= '../templates', static_folder='static', static_url_path='/app/static')
    • 没关系,那是因为它位于“前端”文件夹中的“静态”下(前端/静态)...我仍然无法获得根来使用此蓝图模块。
    • 嗯,好吧,所以只有 static_folder='app/static' 似乎可以解决 Flask 对象内部的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多