Flask 系列之 Blueprint
说明#
- 操作系统:Windows 10
- Python 版本:3.7x
- 虚拟环境管理器:virtualenv
- 代码编辑器:VS Code
实验目标#
学习如何使用 Blueprint
介绍#
接触过 DotNet MVC 开发的朋友应该都对 路由 的概念有一定的了解。所谓 路由 就是指我们访问一个网站时,这个网站各个页面访问时对应的 URL 地址。在我们的网站不是很复杂时,我们可以使用最原始的方法来设计路由,但是对待一个大型项目如果我们的路由不能进行统一管理和配置的话,那么对于项目后期来说,是无法维护的。
对于 Flask 来说,当我们的项目达到一定级别的话,可以尝试将我们的项目进行模块化设计,那么对应的路由我们也应该通过某种方式来进行统一管理和配置,这个时候就可以使用 Blueprint 来解决。
Blueprint 中文叫 蓝图,其作用是用于路由的模块化配置与管理。其常用参数如下图所示:
其中常用的几个参数为:
- name: 蓝图名称;
- import_name:导入的名称,使用 name 即可;
- url_prefix:蓝图的访问前缀;
使用#
打开 Windows Cmd,执行下述操作:
mkdir flask_bp
python -m viratulenv venv
venv\Scripts\activate
pip install flask
code .
执行完毕后,VS Code 会自动加载该目录并启动起来,我们尝试创建一个最简单的示例程序看一下效果,组织一下我们的项目代码,如下图所示:
我们创建了一个项目名为 app 的模块,这个模块作为我们的项目根目录,然后在里面创建了一个 home 子模块,这个模块我们作为我们网站的一个子站点,然后会被注册到主程序中。
定义#
app\home \ init.py 的示例代码如下所示:
from flask import Blueprint
bp = Blueprint('home', __name__)
from . import views
使用#
app\home\views.py 的示例代码如下所示:
from flask import render_template
from . import bp
@bp.route('/index')
@bp.route('/')
def index():
msg = '我是来至模块 home 的视图函数'
return render_template('home/index.html', msg=msg)
添加页面#
app\templates\base.html 的示例代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flask-bp</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
app\templates\home\index.html 的示例代码如下所示:
{% extends 'base.html' %} {% block content %}
<center>
<h1>{{msg}}</h1>
</center>
{% endblock %}
注册#
app_init_.py 的示例代码如下所示:
from flask import Flask
from .home import bp as home_bp
app = Flask(__name__)
app.register_blueprint(home_bp, url__prefix='/')
添加启动函数#
manage.py 的示例代码如下所示:
from app import app
if __name__ == "__main__":
app.run(debug=True)
修改完毕后,尝试在当前虚拟环境中执行 flask run 来运行我们的程序,会出现如下图所示的界面:
需要补充的一点是,如果我们在 HTML 中访问某个模块的视图函数,可以通过 modulename.routename 方式,在上述的示例中,如果我们想访问到 home 模块中 的 “Index” 路由,那么可以通过 home.index 方式即可。
总结#
Blueprint 支持多种配置方式,包括当前模块的路由规则,静态资源的访问位置。需要说明的一点时,由于我们引入了模块化的编程方式,所有可能存在模块与模块之间循环引入的问题,如果出现这种情况的话,我们的某些自定义模块就无法成功导入,这个时候我们可以尝试在某一函数段进行局部导入,这样就可以了。
相关参考#
作者:hippiezhou
出处:https://www.cnblogs.com/hippieZhou/p/10664408.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
Find Anyway
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?