Flask中的blueprint 蓝图简单示例

本文介绍如何使用Flask蓝图来组织大型应用,实现模块化的路由管理。通过实例展示了蓝图的定义、注册过程及如何处理模板渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在python Flask中,我们有时需要将一个网站良好的组织起来,形成开发人员易于理解的结构。app.py一个文件不足以完成这样的任务,需要承载所有的链接,还要做出单独的错误处理、日志处理等功能,都放在一个文件中就比较臃肿。Flask提供了蓝图这种想法,来做这件事。所谓蓝图,实际是将多个路径(/***)下面的函数放到多个文件。通过Flask蓝图的注册机制,让app.py知道某一个链接的路由应该找哪一个子文件。这样的子文件,可以认为是路由注册文件。

Blueprint源代码中大体的想法,是先提供一组Blueprint的函数,通过注册机制让主文件,类似app.py这样的文件知道注册了一些路径。再让主文件在收到请求时,去包含该路径的子文件查找页面逻辑,最后render在view中。

操作:定义子文件,比如B.py,在内部定义函数,用flask的Blueprint初始化childroute,然后用@childroute.route(),def函数去做闭包。

在主文件中,对执行体app进行蓝图注册,用register_blueprint函数。

app.py示例:

增加注册

from flask import Flask
from simple_page.simple_page import simple_page

#goto localhost:5000/hello
app = Flask(__name__)
app.register_blueprint(simple_page)

# Blueprint can be registered many times
#goto localhost:5000/pages/hello
app.register_blueprint(simple_page, url_prefix='/pages')
app.register_blueprint(simple_page, url_prefix='/dir')


if __name__ == '__main__':
    app.run(debug=True)

从上面的多个register_blueprint函数可以看到,一个文件可以被注册多次,这样不同的路径就可以指向同一个目标文件、同一个函数了。import时,就从simple_page文件夹中的simple_page文件导入一个simple_page包

蓝图的子文件示例:

from flask import Blueprint, render_template, abort
from jinja2 import TemplateNotFound

simple_page = Blueprint('simple_page', __name__,
                        template_folder='templates')

@simple_page.route('/', defaults={'page': 'index'})
@simple_page.route('/<page>')
def show(page):
    try:
        return render_template('pages/%s.html' % page)
    except TemplateNotFound:
        abort(404)

将它们分别放入以下的文件夹:

example

|--app.py

|--simple_page

  |--simple_page.py

|--templates

  |--pages

    |--hello.html

    |--index.html

    |--layout.html

    |--world.html

对应关系如下;

app.register_blueprint(new_page)    对应  

new_page = Blueprint('new_page', __name__,

                        template_folder='templates')

这个函数的第一个参数可以和外面的new_page不同名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值