flask blueprint 蓝图与 url_for 的使用(微信报修小程序源码讲解五)

在 flask 开发中 ,我们会经常使用蓝图和url_for()函数 ,下面我们就来详细学习一下 。

blueprint 蓝图是什么?

蓝图 :blueprint 中文译作蓝图,是 flask 模块化的工具 ,对于一个好的应用程序来说 ,应该有很多个蓝图构成 。

我们在写程序的时候 , 都应该是模块化的 ,模块化的作用是:将程序中功能独立开来、模块化 , 在需要此模块的时候引用 ,不需要的时候不引用即可 。

举个例子: 对于一个报修系统 , 可以由用户管理模块、报修管理模块、文章管理模块、消息推送模块构成 。那么如果你已经开发完了用户管理模块、报修管理模块 , 现在你的导师或你的客户或你的项目经理要求你上线报修系统、同时保证上线的功能完整可用 ,那么你正在开发比如消息推送模块 ,开发到50% ,是不完整的未开发完的 ,这时候你只要删除对消息推送模块蓝图的引用即可 , 待开发测试完成之后,引入消息推送模块的蓝图 ,整个程序即增加了一个消息推送模块的功能 。

程序如何定义蓝图呢?

我们看一下 user.py 文件 ,里面有这样一行 ,只要使用 Blueprint() 简单一句话即定义的一个蓝图 ,名字是 user

user = Blueprint('user', __name__)

定义了蓝图之后 ,我们就可以继续定义各种路由,来完成我们的功能 ,如 指向添加用户模版 ,即访问添加用户页面 。

# 用户添加view
@user.route('/addView')
def addView():
    return render_template('/user/addView.html')

定义蓝图后,如何使用蓝图呢 ?

  • 我们看一下蓝图的使用,在 app.py 中 ,我们从controller包下引入了三个蓝图 , 分别是user 、 api 、repair
from controller.user.user import user
from controller.api.api import api
from controller.repair.repair import repair

这三个蓝图分别是做什么的呢 ?

user 后台用户管理模块:用户增删改查 、 用户登录功能 。
api 小程序 api 接口模块:提供小程序需要的各种接口 。
repair 后台报修管理模块: 提供报修数据统计汇总 。

注意:三个模块相互独立 ,假设你只需要 api 模块 ,能为小程序提供接口即可,而不需要后台管理 ,那么在 app.py 就无需引入 user 和 repair 蓝图 。假设你只需要后台管理 ,不需要 api 模块 ,那么不导入 api 模块即可 。

  • 引入蓝图后 ,接下来必须将蓝图注册到程序中才能使用 。
# 注册user,使用前缀 user 作为前缀访问
app.register_blueprint(user, url_prefix='/user')
# 注册api,使用前缀 api 作为前缀访问
app.register_blueprint(api, url_prefix='/api')
# 注册repair,使用前缀 repair 作为前缀访问
app.register_blueprint(repair, url_prefix='/repair')

注册蓝图使用 register_blueprint 方法 ,url_prefix表示访问此蓝图的 url 前缀 ,如访问 user 蓝图 ,你的 url 前缀必须是这里定义的 user ,否则访问不到 。
在这里插入图片描述
讲到这里 ,你可能还是没有意识到蓝图有什么好处 ?第一个好处:模块化 , 第二个好处:能使程序更加灵活 ,下面我们具体看看蓝图是怎么增加程序灵活性的 。

url_for() 与蓝图结合使用

在 home.html 中有下面这样一段话 , 即点击一个菜单跳转到指定的路由 。

        <ul class="layui-nav layui-layout-left layui-bg-blue ">
            <li class="layui-nav-item layui-this"><a href="/repair/listView/1" target="frame">报修信息</a></li>
            <li class="layui-nav-item"><a href="/user/listView/1" target="frame">用户管理</a></li>
            <span class="layui-nav-bar"></span>
        </ul>

html a 标签的 href 我们书写的形式是下面这样

<a href="/repair/listView/1" target="frame">报修信息</a>
<a href="/user/listView/1" target="frame">用户管理</a>

这样写可以不可以呢 ?当然可以 ,因为我们能够访问到 user 蓝图和repair蓝图中的 listView 路由 。

那么这样写好吗 ? 有什么问题呢 ?
这样的写法不好 ,因为失去了程序的灵活性 ,注册蓝图的时候,我们将蓝图的前缀分别设置为 repair 、user 。

app.register_blueprint(user, url_prefix='/user')
app.register_blueprint(repair, url_prefix='/repair')

如果我们想改一下 user 蓝图的前缀 ,如修改为sysUser

app.register_blueprint(user, url_prefix='/sysUser')

再次运行程序 ,你就会发现 href="/user/listView/1" 我们已经访问不到 user 路由 ,我们必须同时修改 href="/user/listView/1" 为 href="/sysUser/listView/1" 才能保证程序正常 。如果你忘记修改页面中 href 的地址就会找不路由 ,但你经常会忘记修改 。

那么如何解决这个问题呢 ?我们使用url_for()来搞定 , 也是工作中使用的方法 , 写法如下 :

<a href="{{ url_for('user.listView',page=1) }}" target="frame">用户管理</a>

详细解析:
url_for 第一个参数 user.listView ,是指:user 蓝图下的 listView 函数。
url_for 第二个参数 page=1 ,是指:user 蓝图下的 listView 函数的参数 page 。

当页面中a href 这样写时 ,我们去改变 app.py 中 user 蓝图的前缀, 将 user 蓝图的前缀设置为任意一个名字 。再次启动程序 ,发现程序正常运行 ,并不会受 user 蓝图前缀名的影响 , 是不是很神奇 ?

再举个例子,我们要访问添加用户的页面,使用 url_for() 应该怎么写呢 ?

原始写法如下:注意变量 url 的写法

    function add() {
        var url = "/user/addView";
        layer.open({
            type: 2,
            title: '添加用户',
            shadeClose: true,
            shade: false,
            maxmin: false, //开启最大化最小化按钮
            area: ['600px', '400px'],
            content: url
        });
    }

新的写法如下:

  function add() {
        var url = "{{ url_for('user.addView') }}";
        layer.open({
            type: 2,
            title: '添加用户',
            shadeClose: true,
            shade: false,
            maxmin: false, //开启最大化最小化按钮
            area: ['600px', '400px'],
            content: url
        });
    }

总结:

blueprint 蓝图在flask开发中具有重要的作用 , 你一定要理解他的作用 。其次使用 url_for() 可使你的蓝图路由访问更加灵活 。请把源代码所有页面中,访问蓝图路由的地址更换为 url_for() 形式 ,不要偷懒哦!

如果你有任何问题 ,欢迎关注个人公众号 JeenWang ,留言与我交流 。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用以下代码来使用 Flask 的 redirect 和 url_for 函数: ``` from flask import Flask, redirect, url_for app = Flask(__name__) @app.route('/') def index(): return redirect(url_for('hello')) @app.route('/hello') def hello(): return 'Hello, World!' if __name__ == '__main__': app.run() ``` 在上面的代码中,我们定义了两个路由函数:`index` 和 `hello`。`index` 函数返回一个重定向到 `hello` 函数的响应,而 `hello` 函数返回一个简单的字符串。 在 `redirect` 函数中,我们使用了 `url_for` 函数来生成 `hello` 函数的 URL。`url_for` 函数接受一个函数名作为参数,并返回该函数的 URL。 当你访问 `index` 函数时,它会重定向到 `hello` 函数,并返回 `Hello, World!`。 ### 回答2: 在Python Flask中,`redirect(url_for(''))`函数可用于重定向用户到另一个路由或页面。`url_for()`函数用于生成路由的URL。 下面是使用`redirect(url_for(''))`的一般步骤: 1. 首先,导入必要的模块: ```python from flask import Flask, redirect, url_for ``` 2. 创建Flask应用程序: ```python app = Flask(__name__) ``` 3. 定义一个或多个路由,对应于不同的URL: ```python @app.route('/') def home(): # 处理首页的逻辑 return '首页' @app.route('/about') def about(): # 处理关于页面的逻辑 return '关于' ``` 4. 创建一个新的路由来处理重定向: ```python @app.route('/redirect') def redirect_function(): # 重定向到'about'路由 return redirect(url_for('about')) ``` 在这个例子中,当用户访问`/redirect`路由时,会调用`redirect_function()`函数,并执行`redirect(url_for('about'))`。这将重定向用户到`/about`路由。 总之,`redirect(url_for(''))`函数可以根据给定的路由名称生成URL,并将用户重定向到生成的URL。 ### 回答3: 在使用Python Flask的redirect函数时,我们可以通过url_for函数来生成重定向的URLurl_for函数的参数是路由函数的名称,路由函数通常在Flask应用程序的路由文件中定义。例如,假设我们有一个index函数来处理主页请求,我们可以在redirect函数中使用url_for('index')来生成重定向到主页的URL。 在使用redirect函数之前,首先需要从flask模块中导入该函数。然后,可以在视图函数(也称为路由函数)中直接调用redirect函数,并将生成的URL作为参数传递进去。例如: ``` from flask import Flask, redirect, url_for app = Flask(__name__) @app.route('/') def index(): # 生成重定向到/about页面的URL return redirect(url_for('about')) @app.route('/about') def about(): # 返回关于页面的内容 return "这是关于页面" if __name__ == '__main__': app.run() ``` 在上面的例子中,当用户访问主页时,index函数会调用redirect函数来生成重定向到/about页面的URL,并将其返回给用户。 需要注意的是,在使用redirect函数之前,需要确保已经定义了重定向目标页面的路由函数。在我们的例子中,我们需要在路由文件中定义一个about函数来处理/about页面的请求。 总结起来,使用Python Flask的redirect函数很简单,只需导入redirect和url_for函数并在视图函数中调用redirect函数,并将url_for函数生成的URL作为参数传递进去即可完成重定向。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值