【问题标题】:Flask Blueprint can't find static folderFlask Blueprint 找不到静态文件夹
【发布时间】:2014-09-11 19:56:03
【问题描述】:

我在我的 Flask 应用程序中设置了一个蓝图,但我似乎无法让我的静态文件夹工作。当它尝试访问它们时,我不断收到 404 错误:

127.0.0.1 - - [11/Sep/2014 15:14:20] "GET /static/js/bootstrap.min.js HTTP/1.1" 404 -
127.0.0.1 - - [11/Sep/2014 15:14:20] "GET /static/static/css/bootstrap.min.css HTTP/1.1" 404 -

css 也附加了两次静态。 JS 具有正确的 /static 但似乎不起作用。现在,我的静态文件夹位于蓝图根路径 (app/dashboard) 中。我尝试将其放入 app/static,但我得到了完全相同的错误。

我有以下设置:

app/dashboard/__init__.py:

from flask import Blueprint
dashboard = Blueprint('dashboard', __name__, template_folder='templates', static_folder='static')
from application.dashboard import controllers

app/__init__.py:

# Blueprints      
from flask import Blueprint
from application.dashboard import dashboard
app.register_blueprint(dashboard)

app/templates/layout.html 中,我有一行引用了两个静态文件,如下所示:

<link rel="stylesheet" type="text/css" href="{{ url_for('dashboard.static', filename='css/bootstrap.min.css') }}">
<script src="{{ url_for('dashboard.static', filename='js/bootstrap.min.js') }}"></script>

我的app/dashboard/static 目录:

$ tree application/dashboard/static/
application/dashboard/static/
├── css
│   ├── bootstrap-theme.css
│   ├── bootstrap-theme.css.map
│   ├── bootstrap-theme.min.css
│   ├── bootstrap.css
│   ├── bootstrap.css.map
│   └── bootstrap.min.css
├── fonts
│   ├── glyphicons-halflings-regular.eot
│   ├── glyphicons-halflings-regular.svg
│   ├── glyphicons-halflings-regular.ttf
│   └── glyphicons-halflings-regular.woff
└── js
    ├── bootstrap.js
    └── bootstrap.min.js

知道这里发生了什么吗?如何正确构建我的蓝图?我已按照 Flask 文档中的说明进行操作,但出现此错误。

谢谢。

【问题讨论】:

    标签: python flask


    【解决方案1】:

    看起来您对应用程序和蓝图的两条相同路线有问题。见我的another answer part 3

    您的应用程序将/static/&lt;path:path&gt; 路由到.static 端点。

    您的蓝图路由/static/&lt;path:path&gt;dashboard.static 端点,因为您在注册蓝图时没有url_prefix 并且有/static - 静态文件夹前缀。

    因此您可以使用以下解决方案之一:

    1. 仅使用应用程序静态文件夹。
    2. 注册蓝图时设置url_prefix
    3. 为蓝图使用另一个静态文件夹前缀。
    4. 禁用应用程序静态文件夹app = Flask(__name__, static_folder=None)
    5. 使用hacks with static endpoint descriptor

    【讨论】:

    • 嗯,我不确定我是否理解解决方案。是否可以不设置 url 前缀,但让静态文件夹转到 dashboard/static
    • 似乎我添加的任何内容都不会对蓝图生效。只有我添加到应用程序才会生效。这是为什么呢?
    • 如果你想避免使用应用程序静态文件夹路由,你应该禁用它:app = Flask(__name__, static_folder=None)。请查看url_prefix的详细信息或使用url_for('dashboard.static', filename='css/bootstrap.min.css')获取真实链接。问题是因为您有两个具有相同路由的端点 - 一个总是不起作用。
    • 诀窍是将应用程序上的 static_folder 设置为无。即使我直接指向路线,它也不起作用。知道为什么吗?我已经使用了正确的 url_for。
    • 正如我所说,您有两个端点,一个用于应用程序.static,一个用于蓝图dashboard.static。这两个端点具有相同的路由/static/&lt;path:path&gt;。因此,当您创建url_for('.static', filename='test.css')url_for('dashboard.static', filename='test.css') 时,它将返回/static/test.css。当您请求然后烧瓶路由系统获取路径/static/test.css 并以优先级迭代每个路由,当它找到第一个(在您的情况下为应用程序端点)满足路由的端点时,该端点将被返回并称为调度程序。
    【解决方案2】:

    你需要为你的蓝图添加 URL 前缀,像这样

    app.register_blueprint(dashboard, url_prefix='/dashboard')
    

    【讨论】:

    • 我不希望所有仪表板都有 /dashboard 前缀。这还有可能吗?
    【解决方案3】:

    我遇到了同样的问题。解决方案是转到蓝图的__init__.py 文件,然后在定义蓝图的语句中添加static_folder="static"

    from flask import Blueprint
    
    main = Blueprint('main', __name__ ,static_folder = "static")
    
    from . import routes
    

    由于app 在此处实际运行为Blueprintmain,这告诉它在主包中查找静态文件夹。如果将其添加到应用程序的 __init__.py 脚​​本中,它将不起作用(问我怎么知道的...)

    【讨论】:

      【解决方案4】:

      为什么不使用 nginx?它在性能方面更快,您不必编写代码来提供静态内容。

      【讨论】:

      • 我将使用 Web 服务器进行生产。我现在正在本地测试。
      • 当然可以,但是 nginx 很容易在本地运行,并且比在烧瓶中编写一组蓝图更简单。此外,它还有助于确保在将您开发的内容启动到您的产品环境之前对其进行测试。
      • 好建议,但这就像回答“我在为列表类实现线性排序方法时遇到问题。我在某处犯了语法错误吗?”与“为什么不使用 RB-tree?这不是太难,而且一直是 O(logn)。”
      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 2022-01-18
      • 2016-04-01
      • 2014-06-06
      • 2021-10-15
      • 2021-03-11
      • 2019-09-19
      • 1970-01-01
      相关资源
      最近更新 更多