bigywater.tech
Flask · 28

Blueprint 的静态文件和模板目录

蓝图能有自己的 static 与 templates 吗?两个蓝图都有 index.html 会发生什么?这篇建一个有 admin 与 blog 两个蓝图的应用,逐项实测。

3
该应用里的静态规则条数(应用 1 + 两个蓝图各 1)
应用优先
同名模板时应用的 templates 目录优先于蓝图
先注册的赢
两个蓝图有同名模板时的结果

目录结构

实测 · 本机执行输出
  admin  root_path = <项目>/admin | template_folder = templates | static_folder = <项目>/admin/static | static_url_path = /static | has_static_folder = True
  blog   root_path = <项目>/blog | template_folder = templates | static_folder = <项目>/blog/static | static_url_path = /blog-assets | has_static_folder = True

上一篇:Blueprint 的 URL 前缀;下一篇:子域名路由。模板加载的更多细节:Flask 模板搜索路径。

蓝图静态文件

实测 · 本机执行输出
  url_for('admin.static', filename='admin.css') → /admin/static/admin.css
  url_for('blog.static', filename='blog.css') → /blog/blog-assets/blog.css
  请求: {'/admin/static/admin.css': 200, '/blog/blog-assets/blog.css': 200, '/static/admin.css': 404, '/admin/static/blog.css': 404}
  应用的规则里与静态相关的: ['/static/<path:filename>', '/admin/static/<path:filename>', '/blog/blog-assets/<path:filename>']

模板查找顺序

实测 · 本机执行输出
  GET /home          → 主应用的 home.html
  GET /admin/        → admin 蓝图的 index.html
  GET /blog/         → admin 蓝图的 index.html
  GET /admin/shared  → 应用的 shared.html
  GET /admin/ns      → admin/page.html(带子目录的命名)
  模板 blog_only.html 只在 blog 蓝图里,应用里任何视图都能用: blog_only.html

EXPLAIN_TEMPLATE_LOADING

实测 · 本机执行输出
    Locating template 'shared.html':
        1: trying loader of application 'main'
           class: jinja2.loaders.FileSystemLoader
           encoding: 'utf-8'
           followlinks: False
           searchpath:
             - <项目>/templates
           -> found ('<项目>/templates/shared.html')
        2: trying loader of blueprint 'admin' (admin)
           class: jinja2.loaders.FileSystemLoader
           encoding: 'utf-8'
           followlinks: False
           searchpath:
             - <项目>/admin/templates

用子目录命名

实测 · 本机执行输出
  /admin/ns → admin/page.html(带子目录的命名) | 应用里列出的全部模板名: ['admin/page.html', 'blog_only.html', 'home.html', 'index.html', 'shared.html']

分步演示

蓝图的资源目录
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:static_folder 为绝对路径、蓝图静态文件的缓存头与应用静态文件的差异、自定义 jinja_loader、模板继承跨蓝图时的查找顺序(见第 52、53 篇)
    京ICP备2026067502号-1京公网安备11010502063487号