写点什么

Python 进阶 (四十九) 初识 Flask Blueprint

  • 2022-11-18
    上海
  • 本文字数:2992 字

    阅读完需:约 10 分钟

Python进阶(四十九)初识Flask Blueprint

一、前言

在进行 Python Web 开发时选择 Flask 框架。项目模块划分阶段,使用Blueprint(这里暂且称之为“蓝本”)。Blueprint通过把实现不同功能的module分开,从而把一个大的application分割成各自实现不同功能的module。在一个Blueprint中可以调用另一个 blueprint 的 view function, 但要加相应的 blueprint 名。


Blueprint 还有其他好处,其本质上来说就是让程序更加松耦合,更加灵活,增加复用性,提高查错效率,降低出错概率。在具体项目开发过程中,不同蓝本分别对应不同的功能模块。例如 auth 授权模块和项目主模块。

二、实例讲解

下面以实际项目开发为例,项目结构图如下图所示:



不同蓝本分别位于不同的Python包中,而蓝图的创建则位于 Python 包下的__init__.py文件。不同 Python 包下的views.py文件则对应不同蓝本下的路由。


在示例项目中,auth 授权包下的蓝本创建代码如下:


from flask import Blueprint
auth = Blueprint('auth', __name__)
from . import forms, views
复制代码


上面的蓝本创建语句创建了名为“auth”的蓝本。之所以将from . import forms, views 导包语句置于__init__.py末尾,是为了避免循环导入依赖,因为在 views.py 中还要导入蓝本 auth。


Views.py 文件内容如下:


from flask import request, flash, render_template, redirect, url_forfrom . import authfrom web_flask.app.dal_pymysql import DataManager
# 管理员登录@auth.route('/login', methods=['POST'])def login(): form = request.form # 由于request中的form参数以字典的形式存在,故以下语句等价 uname = request.form['username'] pwd = request.form['password']
复制代码


在这里使用 from . import auth 方式导入所需蓝本。蓝本的注册语句则置于项目创建的工厂方法中,注册代码如下:


from .auth import auth as auth_blueprintfrom .main import main as main_blueprint# 注册蓝本 url_prefix='/admin'app.register_blueprint(auth_blueprint,)app.register_blueprint(main_blueprint, static_folder='static')return app
复制代码


在蓝本注册函数register_blueprint()中,第一个参数为所注册的蓝本名称。当我们在应用对象上注册一个蓝图时,需要指定一个 url_prefix 关键字 参数(这个参数默认是/)。其余可增参数详见 Flask 官方文档。

三、注意事项

注意:在蓝本中编写视图函数 views.py 主要有两点不同:


  • 和前面的路由程序一样,路由修饰器由蓝本提供;

  • url_for() 函数的用法不同。


你可能还记得,url_for() 函数的第一个参数是路由的端点名,在程序的路由中,默认为视图函数的名字。例如,在单脚本程序中,index() 视图函数的 URL 可使用url_for('index') 获取。


在蓝本中就不一样了,Flask 会为蓝本中的全部端点加上一个命名空间,这样就可以在不同的蓝本中使用相同的端点名定义视图函数,而不会产生冲突。命名空间就是蓝本的名字(Blueprint 构造函数的第一个参数),所以视图函数 index() 注册的端点名是 main.index,其 URL 使用 url_for('main.index') 获取。


url_for()函数还支持一种简写的端点形式,在蓝本中可以省略蓝本名,例如 url_for('.index')。在这种写法中,命名空间是当前请求所在的蓝本。这意味着同一蓝本中的重定向可以使用简写形式,但跨蓝本的重定向必须使用带有命名空间的端点名。


如果不使用 url_for('main.index') 或 url_for('.index') 的形式,在项目运行过程中就会提示请求的 URL 错误。

四、拓展阅读

  • Flask Web开发:基于Python的Web应用开发实战

  • Learning Python, 5th Edition》@[TOC]

    ## 一、前言

    在进行 Python Web 开发时选择 Flask 框架。项目模块划分阶段,使用`Blueprint`(这里暂且称之为“蓝本”)。`Blueprint`通过把实现不同功能的`module`分开,从而把一个大的`application`分割成各自实现不同功能的`module`。在一个`Blueprint`中可以调用另一个 blueprint 的 view function, 但要加相应的 blueprint 名。

    Blueprint 还有其他好处,其本质上来说就是让程序更加松耦合,更加灵活,增加复用性,提高查错效率,降低出错概率。

    在具体项目开发过程中,不同蓝本分别对应不同的功能模块。例如 auth 授权模块和项目主模块。

    ## 二、实例讲解

    下面以实际项目开发为例,项目结构图如下图所示:

    ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/8fa9f1a35f29c89f6014fc00367eddf5.png)

    不同蓝本分别位于不同的`Python`包中,而蓝图的创建则位于 Python 包下的`__init__.py`文件。不同 Python 包下的`views.py`文件则对应不同蓝本下的路由。

    在示例项目中,auth 授权包下的蓝本创建代码如下:

    ```python

    from flask import Blueprint

    auth = Blueprint('auth', __name__)

    from . import forms, views

    ```

    上面的蓝本创建语句创建了名为“auth”的蓝本。之所以将`from . import forms`, views 导包语句置于`__init__.py`末尾,是为了避免循环导入依赖,因为在 views.py 中还要导入蓝本 auth。

    Views.py 文件内容如下:

    ```python

    from flask import request, flash, render_template, redirect, url_for

    from . import auth

    from web_flask.app.dal_pymysql import DataManager

    # 管理员登录

    @auth.route('/login', methods=['POST'])

    def login():

    form = request.form

    # 由于 request 中的 form 参数以字典的形式存在,故以下语句等价

    uname = request.form['username']

    pwd = request.form['password']

    ```

    在这里使用 from . import auth 方式导入所需蓝本。蓝本的注册语句则置于项目创建的工厂方法中,注册代码如下:

    ```python

    from .auth import auth as auth_blueprint

    from .main import main as main_blueprint

    # 注册蓝本 url_prefix='/admin'

    app.register_blueprint(auth_blueprint,)

    app.register_blueprint(main_blueprint, static_folder='static')

    return app

    ```

    在蓝本注册函数`register_blueprint()`中,第一个参数为所注册的蓝本名称。当我们在应用对象上注册一个蓝图时,需要指定一个 url_prefix 关键字 参数(这个参数默认是`/`)。其余可增参数详见 Flask 官方文档。

    ## 三、注意事项

    注意:在蓝本中编写视图函数 views.py 主要有两点不同:

    - 和前面的路由程序一样,路由修饰器由蓝本提供;

    - `url_for()` 函数的用法不同。

    你可能还记得,`url_for()` 函数的第一个参数是路由的端点名,在程序的路由中,默认为视图函数的名字。例如,在单脚本程序中,index() 视图函数的 URL 可使用`url_for('index')` 获取。

    在蓝本中就不一样了,Flask 会为蓝本中的全部端点加上一个命名空间,这样就可以在不同的蓝本中使用相同的端点名定义视图函数,而不会产生冲突。命名空间就是蓝本的名字(Blueprint 构造函数的第一个参数),所以视图函数 index() 注册的端点名是 main.index,其 URL 使用 url_for('main.index') 获取。

    url_for()函数还支持一种简写的端点形式,在蓝本中可以省略蓝本名,例如 url_for('.index')。在这种写法中,命名空间是当前请求所在的蓝本。这意味着同一蓝本中的重定向可以使用简写形式,但跨蓝本的重定向必须使用带有命名空间的端点名。

    如果不使用 url_for('main.index') 或 url_for('.index') 的形式,在项目运行过程中就会提示请求的 URL 错误。

    ## 四、拓展阅读

    - 《[Flask Web 开发:基于 Python 的 Web 应用开发实战](http://download.csdn.net/detail/sunhuaqiang1/9838901)》

    - 《[Learning Python, 5th Edition](http://download.csdn.net/detail/sunhuaqiang1/9838905)》

发布于: 10 分钟前阅读数: 5
用户头像

No Silver Bullet 2021-07-09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
Python进阶(四十九)初识Flask Blueprint_Python_No Silver Bullet_InfoQ写作社区