Flask蓝图静态目录不起作用?

时间:2014-03-03 17:08:27

标签: python flask

According to the Flask readme,蓝图静态文件可在blueprintname/static访问。但由于某种原因,它不起作用。

我的蓝图是这样的:

  • app/frontend/views.py

    frontend = Blueprint('frontend', __name__, 
                         template_folder='templates',
                         static_folder='static')
    
    @frontend.route('/') etc...
    
  • app/frontend/js/app.js:我的javascript

  • 在Flask app中注册的蓝图(路线工作和一切)

当我转到abc.com/frontend/static/js/app.js时,它只会给出404。

当我按照Flask自述文件获取我的静态文件时:

<script src="{{url_for('frontend.static', filename='js/app.js')}}"></script>

输出

<script src="/static/js/app.js"></script>

哪个也不起作用。我的根app/static/文件夹中没有任何内容。

我无法访问我的蓝图中的任何静态文件! Flask读到我说它应该有效!

admin = Blueprint('admin', __name__, static_folder='static')
     

默认情况下,路径的最右边部分是在Web上公开的位置。由于该文件夹在此处称为静态,因此它将在蓝图+ / static的位置可用。假设蓝图已注册为/ admin,静态文件夹将位于/ admin / static。

6 个答案:

答案 0 :(得分:17)

您可能已将您的蓝图注册为您网站的根目录:

app.register_blueprint(core, url_prefix='')

但蓝图中的static视图与您的所有其他蓝图视图没有区别;它使用url_prefix值来使URL唯一。

核心 static视图处于活动状态,因此您现在有两条想要处理/static/网址的路由。因此,如果您在没有URL前缀的情况下注册Blueprint,则必须为这两个中的一个提供唯一的路径。

为蓝图提供自定义static_url_path值或核心Flask app

答案 1 :(得分:16)

我在static_url_path参数中包含一个参数,以确保Blueprint的静态路径不会与主应用程序的静态路径冲突。

e.g:

admin = Blueprint('admin', __name__, static_folder='static', static_url_path='/static/admin')

答案 2 :(得分:5)

通过初始化此configuration = Blueprint('configuration', __name__, template_folder='templates',static_folder='static')之类的蓝图,然后引用静态文件(例如href="{{ url_for('.static', filename='css/base.css') }}"),它对我有用。在href中静态之前有一个点。

答案 3 :(得分:2)

我正在使用Flask蓝图。

我的网络应用Attendance Manager具有三种类型的用户:管理员,教师和学生。

这是文件结构的一部分的外观:

+---app.py
|
|
+---student
|   |   student.py
|   |   __init__.py
|   |   
|   +---static
|   |   +---css
|   |   |       login-page.css
|   |   |       signup-page.css
|   |   |       
|   |   \---js
|   |           firebaseConfig.js
|   |           
|   +---templates
|   |       base.html
|   |       student-login-page.html
|   |       student-signup-page.html

app.py:

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

student.py:

student = Blueprint('student', __name__, static_folder='static', template_folder='templates')

student-login-page.html:

<link rel="stylesheet" type="text/css" href="{{ url_for('student.static', filename='css/login-page.css') }}">

将“ the_name_of_the_blueprint.static”添加到student-login-page.html中url_for()的第一个参数中(或您链接CSS的任何位置)可以帮助我解决问题。

在官方文档中找到了解决方案here

This GitHub问题或this Reddit帖子可能无法帮助您解决问题。

祝一切顺利!

答案 4 :(得分:1)

我来晚了一点,但是以前的答案都没有真正帮助我实现所需的知识。我发现我需要做一些“技巧”以使模块的静态文件夹按我的预期工作。 我的应用程序由几个模块组成,但是现在假装我们将“ application”作为主应用程序文件夹,将“ locations”作为模块的文件夹,该文件夹中放置了本地“ static”目录(为此,我们需要在其中加载静态文件)模块)。以下是我所做的:

  1. 在主应用程序的__init__py文件中,我在蓝图的定义中添加了url_prefix='/'
  2. 在模块的routes.py文件中,我同时使用了两个静态参数:static_folder='static''static_url_path='/locations/static'来声明蓝图
  3. 在html模板(扩展了主应用程序文件夹中的模板)中,我使用以下内容检索了静态css文件的路径:{{url_for('locations_bp.static', filename='css/style.css')}}locations_bp是我的Bluprint的“位置”模块

这样,将css文件加载为/locations/static/css/style.css,这正是我想要实现的目标:首先,我使用的url_prefix允许我避免在模块的所有路由上都添加前缀

答案 5 :(得分:0)

上述解决方案对我不起作用。我必须同时添加static_folderstatic_url_path,然后在blueprint_name.static中使用url_for,如下所示:

user_blueprint = Blueprint('users_section', __name__, template_folder='templates', static_folder='static', static_url_path='/user')

HTML代码:

<script src={{ url_for('users_section.static', filename='js/particles.min.js') }}></script>