我的蓝图应该在根目录中查找静态文件,但不是。
说我有一个名为'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)
答案 0 :(得分:3)
每个烧瓶应用程序,蓝图和模块都有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/
模板前缀)。
例如,对于扩展,它有助于在包中使用模板,并且已经有能力在您的应用程序中替换它(如果您需要继承,则需要为模板提供新名称)。
规则没有任何蓝图前缀 - 在蓝图中你只是连接前缀和规则然后只使用它。
因此,所有网址规则都将使用现有规则解决(请参阅另一个答案https://stackoverflow.com/a/17146563/880326)。
您可以使用相同的网址规则说明(/static
和/static
)并且只能使用一个端点。
默认情况下,应用程序存在静态文件夹。对于蓝图,您应该添加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") }}