flask蓝图使用三部曲

Flask蓝图详解

Flask 提供了 Blueprint (蓝图) 的功能,让我们可以实现模块化的应用。使用它主要有以下好处:

  • 将一个复杂的大型应用分解成若干蓝图的集合,也就是若干个子应用或者说模块,每个蓝图都包含了可以作为独立模块的视图、模板和静态文件等;
  • 制作通用的组件,使开发者更易复用组件;

1、创建蓝图对象

from flask import Blueprint

book_bp = Blueprint('book', __name__)

Blueprint 要求至少传入两个参数,第一个参数是蓝图的名称,第二个参数是蓝图所在的包或模块,其他参数是可选的,比
如 template_folder  , url_prefix  和 static_folder  等。

2、在蓝图中使用路由

# book_bp 就是我们创建的蓝图对象
@book_bp.route('/book/<name>')

3、在app.py中注册

from flask import Flask
from book import book_bp

app = Flask(__name__)
# 注册蓝图
app.register_blueprint(book_bp)

 

<think>Flask蓝图(Blueprint)是一种组织Flask应用的方式,可以将应用拆分成多个模块,使得项目结构更清晰,便于维护和扩展。下面是一个使用Flask蓝图的范例。 假设我们要构建一个简单的Web应用,包含两个模块:用户认证(auth)和文章管理(post)。我们将使用蓝图来组织这两个模块。 项目结构: ``` myapp/ __init__.py auth/ __init__.py views.py post/ __init__.py views.py templates/ ... # 模板文件 static/ ... # 静态文件 ``` 1. 首先,创建主应用文件 `myapp/__init__.py`: ```python from flask import Flask def create_app(): app = Flask(__name__) # 注册蓝图 from .auth.views import auth_bp from .post.views import post_bp app.register_blueprint(auth_bp, url_prefix='/auth') app.register_blueprint(post_bp, url_prefix='/post') return app ``` 2. 创建认证模块蓝图 `myapp/auth/views.py`: ```python from flask import Blueprint, render_template, redirect, url_for # 创建蓝图,第一个参数是蓝图名称,第二个参数是所在模块 auth_bp = Blueprint('auth', __name__) @auth_bp.route('/login') def login(): return render_template('auth/login.html') @auth_bp.route('/logout') def logout(): return redirect(url_for('auth.login')) ``` 3. 创建文章管理模块蓝图 `myapp/post/views.py`: ```python from flask import Blueprint, render_template post_bp = Blueprint('post', __name__) @post_bp.route('/') def index(): return "Post Index Page" @post_bp.route('/show/<int:id>') def show(id): return f"Showing post with id {id}" ``` 4. 运行应用:在项目根目录下创建一个 `run.py` 文件: ```python from myapp import create_app app = create_app() if __name__ == '__main__': app.run(debug=True) ``` 解释: - 在 `create_app` 工厂函数中,我们创建了Flask实例,并注册了两个蓝图:`auth_bp` 和 `post_bp`,并分别指定了URL前缀(`url_prefix`)。 - 在蓝图模块中,我们使用 `Blueprint` 类创建蓝图对象,然后使用 `@<blueprint_name>.route` 装饰器定义路由。 - 蓝图的名称在构造时指定(如 `'auth'`),在反向解析URL时,需要使用带命名空间的名称,格式为:`<blueprint_name>.<view_function_name>`,例如:`url_for('auth.login')`。 - 使用蓝图后,认证模块的登录URL为 `/auth/login`,文章模块的显示文章URL为 `/post/show/<id>`。 这样,通过蓝图我们将应用分成了两个模块,每个模块可以独立编写视图函数,便于团队协作和代码维护。 §§相关问题§§: 1. 如何在Flask蓝图使用模板目录和静态文件目录? 2. 如何在Flask蓝图使用before_request等钩子函数? 3. 如何在一个蓝图中嵌套另一个蓝图? 4. 蓝图之间如何共享数据或函数?</think>### Flask蓝图使用范例 Flask蓝图(Blueprint)是组织大型Flask应用的模块化方式,允许将应用拆分为可重用的组件。下面是一个完整的蓝图使用示例: ```python # 主应用文件: app.py from flask import Flask from auth import auth_bp # 导入认证蓝图 from blog import blog_bp # 导入博客蓝图 app = Flask(__name__) # 注册蓝图并指定URL前缀 app.register_blueprint(auth_bp, url_prefix='/auth') app.register_blueprint(blog_bp, url_prefix='/blog') @app.route('/') def home(): return "Welcome to the main page!" if __name__ == '__main__': app.run(debug=True) ``` ```python # 认证蓝图: auth/views.py from flask import Blueprint, render_template, redirect, url_for # 创建蓝图对象 auth_bp = Blueprint( 'auth', # 蓝图名称 __name__, # 当前模块名 template_folder='templates/auth', # 蓝图专用模板目录 static_folder='static/auth' # 蓝图专用静态文件目录 ) @auth_bp.route('/login') def login(): return render_template('login.html') # 使用蓝图模板 @auth_bp.route('/logout') def logout(): return redirect(url_for('auth.login')) # 蓝图内反向解析 @auth_bp.before_request def before_auth_request(): print("Auth blueprint request started") ``` ```python # 博客蓝图: blog/views.py from flask import Blueprint, jsonify blog_bp = Blueprint('blog', __name__) @blog_bp.route('/posts') def list_posts(): return jsonify([{'id': 1, 'title': 'First Post'}]) @blog_bp.route('/post/<int:post_id>') def show_post(post_id): return f"Showing post {post_id}" ``` ### 项目结构 ``` myapp/ ├── app.py # 主应用 ├── auth/ # 认证蓝图模块 │ ├── __init__.py │ ├── views.py │ └── templates/auth/ # 蓝图专用模板 │ └── login.html ├── blog/ # 博客蓝图模块 │ ├── __init__.py │ └── views.py └── templates/ # 全局模板 ``` ### 关键点解释: 1. **蓝图创建**: - 使用 `Blueprint()` 创建蓝图对象 - 参数:名称、导入名、模板/静态文件目录 2. **蓝图注册**: - 主应用使用 `register_blueprint()` 注册 - `url_prefix` 为蓝图添加统一URL前缀 3. **路由定义**: - 使用 `@blueprint_name.route` 装饰器定义路由 - 支持所有标准Flask路由功能 4. **反向解析**: - 蓝图使用 `url_for('蓝图名.视图函数名')` - 示例:`url_for('auth.login')` 5. **蓝图钩子**: - 支持 `before_request`、`after_request` 等钩子 - 只在蓝图范围内生效 6. **资源隔离**: - 每个蓝图可拥有独立的模板/静态文件目录 - 查找顺序:蓝图目录 > 全局目录 ### 优点: 1. **模块化**:将功能拆分为独立组件 2. **可重用**:蓝图可跨项目复用 3. **命名空间**:避免视图函数/URL冲突 4. **延迟注册**:蓝图可在应用初始化后注册
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值