Flask蓝图(Blueprint)是组织大型Flask应用的强大工具,它允许开发者将应用分解为可重用的组件。本文将全面介绍Flask蓝图的概念、使用方法以及高级技巧,帮助您构建结构清晰、易于维护的Flask应用。
蓝图是Flask中的一种组织工具,可以理解为:
# auth/__init__.py
from flask import Blueprint
bp = Blueprint('auth', __name__)
@bp.route('/login')
def login():
return 'Login Page'
@bp.route('/logout')
def logout():
return 'Logout Page'
关键参数:
'auth'
:蓝图名称(唯一标识)__name__
:确定蓝图所在的模块# app.py
from flask import Flask
from auth import bp as auth_bp
app = Flask(__name__)
app.register_blueprint(auth_bp, url_prefix='/auth')
if __name__ == '__main__':
app.run()
效果:
/auth/login
→ login视图/auth/logout
→ logout视图/myapp
/auth
__init__.py # 创建蓝图
routes.py # 路由定义
forms.py # 表单定义
/blog
__init__.py
routes.py
app.py # 主应用
# auth/routes.py
from . import bp
@bp.route('/login', methods=['GET', 'POST'])
def login():
# 登录逻辑
pass
# auth/__init__.py
from flask import Blueprint
bp = Blueprint('auth', __name__)
from . import routes # 导入路由
bp = Blueprint('admin', __name__, static_folder='static_admin')
app.register_blueprint(bp, url_prefix='/admin')
# 访问: /admin/static_admin/
bp = Blueprint('admin', __name__, template_folder='templates_admin')
# 模板查找顺序:
# 1. 应用模板文件夹
# 2. 蓝图模板文件夹
@bp.before_request
def require_login():
if not current_user.is_authenticated:
return redirect(url_for('auth.login'))
@bp.after_request
def add_header(response):
response.headers['X-Powered-By'] = 'My Admin Panel'
return response
before_request
before_request
after_request
after_request
# 在auth蓝图生成blog蓝图的URL
url_for('blog.show_post', post_id=42)
# 在模板中使用相同语法
<a href="{{ url_for('blog.show_post', post_id=post.id) }}">Read More</a>
@bp.context_processor
def inject_admin_vars():
return dict(
admin_layout=True,
site_name="My App Admin"
)
# app_factory.py
from flask import Flask
from .auth import bp as auth_bp
from .blog import bp as blog_bp
def create_app(config_class='config.Config'):
app = Flask(__name__)
app.config.from_object(config_class)
app.register_blueprint(auth_bp, url_prefix='/auth')
app.register_blueprint(blog_bp, url_prefix='/blog')
return app
# auth/__init__.py
def init_app(app):
app.register_blueprint(bp, url_prefix='/auth')
# app_factory.py
from .auth import init_app as init_auth
def create_app():
app = Flask(__name__)
init_auth(app)
# 其他初始化...
return app
# parent.py
parent = Blueprint('parent', __name__, url_prefix='/parent')
# child.py
child = Blueprint('child', __name__, url_prefix='/child')
parent.register_blueprint(child)
# 最终URL: /parent/child/route
def register_blueprints(app):
prefix = '/v' + app.config['API_VERSION']
app.register_blueprint(api_bp, url_prefix=prefix)
import pytest
from myapp import create_app
@pytest.fixture
def client():
app = create_app({'TESTING': True})
with app.test_client() as client:
yield client
def test_auth_blueprint(client):
response = client.get('/auth/login')
assert response.status_code == 200
项目结构:
命名规范:
bp
作为蓝图变量名(非强制)注册顺序:
/myapp
/auth # 认证蓝图
/static # 蓝图静态文件
/templates # 蓝图模板
__init__.py # 蓝图创建
routes.py # 路由定义
forms.py # 表单定义
/blog # 博客蓝图
__init__.py
routes.py
/api # API蓝图
__init__.py
v1.py # API版本1
v2.py # API版本2
/templates # 主模板
static # 主静态文件
config.py # 配置
app.py # 应用工厂
适度拆分:
资源管理:
文档规范:
性能考虑:
通过合理运用蓝图,您可以创建出模块化、可维护且易于扩展的Flask应用程序。记住,良好的组织结构是项目成功的基础,而蓝图正是Flask提供的最佳模块化工具。