Flask框架蓝图和子域名怎么配置,需要注意什么?
- 云服务器
- 2026-07-24
- 9
蓝图的基本概念
Flask 蓝图(Blueprint)是用于实现应用模块化的工具,它允许开发者将路由、视图、模板和静态文件组织成独立的组件,然后在主应用中注册,从而实现代码的清晰分离和复用。
创建蓝图
使用 Blueprint 类创建蓝图对象,需要传入蓝图名称和 import_name(通常为 __name__)。
from flask import Blueprint admin_bp = Blueprint('admin', __name__)
可以在创建时指定 template_folder、static_folder 等参数,也可以在注册时配置 URL 前缀、子域名等。
注册蓝图
在主应用中使用 app.register_blueprint() 注册蓝图,并可以附加配置。
app.register_blueprint(admin_bp, url_prefix='/admin')
注册时可用的参数包括:
- url_prefix:给蓝图所有路由添加统一前缀
- subdomain:指定子域名,使蓝图仅在特定子域名下生效
- template_folder、static_folder:覆盖蓝图创建时的路径
蓝图的模板和静态文件
蓝图可以拥有独立的模板和静态文件目录,便于模块化,创建时指定:
bp = Blueprint('blog', __name__, template_folder='templates', static_folder='static')
在视图中使用 render_template('index.html') 时,Flask 会优先在蓝图模板目录中查找,静态文件通过 bp.static 端点访问,或使用 url_for('blog.static', filename='style.css')。
子域名配置详解
子域名配置允许将不同子域名映射到不同蓝图,实现多站点架构。

设置 SERVER_NAME
在应用配置中必须设置 SERVER_NAME,Flask 才能正确解析子域名。
app.config['SERVER_NAME'] = 'example.com'
本地开发时需包含端口,'localhost:5000' 或 'example.com:5000'。
蓝图注册时指定 subdomain
在注册蓝图时传入 subdomain 参数:
app.register_blueprint(admin_bp, subdomain='admin')
这样,所有对 admin.example.com 的请求将路由到 admin_bp 定义的路由。


同时使用子域名和 URL 前缀
可以组合使用:
app.register_blueprint(admin_bp, subdomain='admin', url_prefix='/dashboard')
此时访问 admin.example.com/dashboard 才会匹配该蓝图。
示例对照表
| 蓝图名 | 子域名 | URL前缀 | 完整访问地址 |
|---|---|---|---|
| admin_bp | admin | 无 | admin.example.com/ |
| user_bp | user | /profile | user.example.com/profile |
| main_bp | 无 | example.com/ |
本地测试注意事项
- 修改 hosts 文件,将子域名指向 127.0.0.1: 0.0.1 admin.example.com 127.0.0.1 user.example.com
- 配置 SERVER_NAME 为 example.com:5000(假设端口 5000)
- 访问时需使用完整域名:http://admin.example.com:5000/
- 调试模式下有时需重启应用才能生效
相关问题与解答
问题1:如何在同一个 Flask 应用中同时使用子域名和 URL 前缀?
解答: 可以在注册蓝图时同时指定 subdomain 和 url_prefix 参数。
app.register_blueprint(dashboard_bp, subdomain='admin', url_prefix='/dashboard')
这样,该蓝图仅响应 admin.example.com/dashboard/... 的请求,当子域名和 URL 前缀同时存在时,Flask 会先匹配子域名,再匹配 URL 前缀,确保路由定向准确。
问题2:子域名配置时,本地测试无法访问子域名,可能出现哪些问题?
解答: 常见问题及解决方法如下:
- 未设置 SERVER_NAME:必须配置 app.config['SERVER_NAME'],并包含端口(如 localhost:5000)。
- hosts 文件未修改:本地 DNS 无法解析自定义子域名,需在 hosts 中添加映射。
- 端口号不匹配:访问 URL 中必须包含与 SERVER_NAME 一致的端口,http://admin.example.com:5000。
- 蓝图路由未正确注册:检查 register_blueprint 中 subdomain 参数是否拼写正确。
- Flask 调试模式缓存:某些情况下需重启应用,或设置 app.url_map 并手动调用 app.url_map 更新,建议在开发时使用 app.run(debug=True) 并确保每次修改配置后重启服务。