Flask蓝图在蓝图中查找静态文件而不是根目录

时间:2014-07-23 17:33:25

标签: python jinja2 flask

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

说我有一个名为'frontend'的蓝图。 '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)

2 个答案:

答案 0 :(得分:3)

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。网址规则

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

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

您可以使用相同的网址规则说明(/static/static)并且只能使用一个端点。

3。静态文件

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

对于flask应用程序,蓝图和模块完全静态文件夹依赖形式root_path取决于__name__参数。

但是,如果您有没有网址前缀的蓝图,请更好地设置另一个static_url_path以避免错误。

答案 1 :(得分:0)

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

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

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