• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

flask-11蓝图blueprint

武飞扬头像
春天的菠菜
帮助1

目录

一、为什么用蓝图?

二、蓝图的概念

 三、简单示例

1、新增apps包

 2、apps下新增包user、order、goods

 3、在包user下创建view.py

 4、修改apps下__init__创建一个flask得app函数

5、改造app.py

6、启动服务

四、改造简单示例

1、templates下新建user文件夹

2、user下新建resgister.html show.html  login.html

 3、templates下新建base.html

 4、编写register.html继承base.html

5、修改user下得view.py

 6、修改user下show.html

7、修改初始化加载模板路径apps下得__init__

 8、启动服务

五、实现删除

1、改造user下得view.py新增删除路由

2、修改show.html

3、启动服务注册用户进行删除

六、实现更新

1、templates/user下新增update.html

2、修改templates/user下show.html

3、修改view.py

4、启动服务


Flask 使用了 蓝图 的概念在一个应用或者跨应用中构建应用组件以及支持通用模式。 蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。 一个 Blueprint 对象与 Flask 应用对象的工作方式很像,但它确实不是一个应用, 而是一个描述如何构建或扩展应用的 蓝图 。

一、为什么用蓝图?

Flask中的蓝图旨在针对这些情况:

  • 把一个应用分解成一系列的蓝图。对于大型的应用是理想化的;一个项目能实例化一个应用, 初始化一些扩展,以及注册一系列的蓝图。
  • 以一个 URL 前缀和/或子域在一个应用上注册蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
  • 在一个应用中用不同的 URL 规则多次注册一个蓝图。
  • 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或视图函数。
  • 初始化一个 Flask 扩展时,在这些情况中注册蓝图。

Flask 中的蓝图不是即插应用,因为它实际上并不是一个应用 – 它是可以注册,甚至可以多次注册到应用上的操作集合。为什么不使用多个应用对象?你可以做到那样 (见 应用调度 ),但是你的应用会有分开的配置,并在 WSGI 层管理。

蓝图作为 Flask 层提供分割的替代,共享应用配置,并且可以更改所注册的应用对象。其短板是你不能在应用创建后撤销注册一个蓝图而不销毁整个应用对象。

二、蓝图的概念

蓝图的基本设想是它们记录注册到一个应用时的操作执行情况。 当从一个端点到另一端分发请求和生成 URL 时,Flask 关联视图函数和蓝图。

学新通

 三、简单示例

1、新增apps包

学新通

 2、apps下新增包user、order、goods

学新通

 3、在包user下创建view.py

  1.  
    from flask import Blueprint
  2.  
     
  3.  
    user_bp = Blueprint('user', __name__)
  4.  
     
  5.  
     
  6.  
    @user_bp.route('/')
  7.  
    def user_center():
  8.  
    return '用户中心'
  9.  
     
  10.  
     
  11.  
    @user_bp.route('/register', methods=['GET', 'POST'])
  12.  
    def register():
  13.  
    return '用户注册'
  14.  
     
  15.  
     
  16.  
    @user_bp.route('/login', methods=['GET', 'POST'])
  17.  
    def login():
  18.  
    return '用户登录'
  19.  
     
  20.  
     
  21.  
    @user_bp.route('/logout', methods=['GET', 'POST'])
  22.  
    def logout():
  23.  
    return '用户退出'
学新通

 4、修改apps下__init__创建一个flask得app函数

  1.  
    from flask import Flask
  2.  
    import settings
  3.  
    from apps.user.view import user_bp
  4.  
     
  5.  
     
  6.  
    def create_app():
  7.  
    app = Flask(__name__)
  8.  
    # 加载配置
  9.  
    app.config.from_object(settings)
  10.  
    # 蓝图 ,将蓝图对象绑定到app上
  11.  
    app.register_blueprint(user_bp)
  12.  
    print(app.url_map)
  13.  
    return app
  14.  
     
  15.  
     
  16.  
    if __name__ == '__main__':
  17.  
    app = create_app()
  18.  
    app.run()
学新通

5、改造app.py

  1.  
    from flask import Flask
  2.  
     
  3.  
    from apps import create_app
  4.  
     
  5.  
    app = create_app()
  6.  
     
  7.  
    if __name__ == '__main__':
  8.  
    app.run()

6、启动服务

学新通

 学新通

 一个简单示例完成

四、改造简单示例

1、templates下新建user文件夹

学新通

2、user下新建resgister.html show.html  login.html

学新通

 3、templates下新建base.html

学新通

  1.  
    <!DOCTYPE html>
  2.  
    <html lang="en">
  3.  
    <head>
  4.  
    <meta charset="UTF-8">
  5.  
    <title>
  6.  
    {% block title %} 父模板的title{% endblock %}
  7.  
    </title>
  8.  
    <style>
  9.  
    #head{
  10.  
    height: 50px;
  11.  
    background-color: bisque;
  12.  
    }
  13.  
     
  14.  
    #head ul{
  15.  
    list-style: none;
  16.  
    height: 50px;
  17.  
    }
  18.  
    #head ul li{
  19.  
    float: left;
  20.  
    width: 100px;
  21.  
    text-align: center;
  22.  
    font-size: 15px;
  23.  
    line-height: 50px;
  24.  
    }
  25.  
     
  26.  
    #middle{
  27.  
    height: 100%;
  28.  
    background-color: azure;
  29.  
    }
  30.  
    #foot{
  31.  
    height: 50px;
  32.  
    line-height: 50px;
  33.  
    background-color: darkolivegreen;
  34.  
    }
  35.  
    </style>
  36.  
    {% block modle_style %}{% endblock %}
  37.  
     
  38.  
    </head>
  39.  
    <body>
  40.  
    <div id="head">
  41.  
    <ul>
  42.  
    <li><a href="">首页</a></li>
  43.  
    <li><a href="">秒杀</a><</li>
  44.  
    <li><a href="">超市</a><</li>
  45.  
    <li><a href="">图书</a><</li>
  46.  
    <li><a href="">会员</a><</li>
  47.  
     
  48.  
    </ul>
  49.  
    </div>
  50.  
     
  51.  
    <div id="middle">
  52.  
    {% block middle %} 中间{% endblock %}
  53.  
    </div>
  54.  
    <div id="foot">
  55.  
    我是底部
  56.  
    </div>
  57.  
    {% block myjs %}{% endblock %}
  58.  
    </body>
  59.  
    </html>
学新通

 4、编写register.html继承base.html

  1.  
    {% extends 'base.html' %}
  2.  
    {% block title %}
  3.  
    用户注册
  4.  
    {% endblock %}
  5.  
    {% block middle %}
  6.  
    <p style="color: red">{{ msg }}</p>
  7.  
    <!--<form action="/register" method="post"> -->
  8.  
    <form action="{{url_for('user.register')}}" method="post">
  9.  
    <p><input type="text" name="username" placeholder="用户名"></p>
  10.  
    <p><input type="password" name="password" placeholder="密码"></p>
  11.  
    <p><input type="password" name="repassword" placeholder="确认密码"></p>
  12.  
    <p><input type="number" name="phone" placeholder="手机号码"></p>
  13.  
    <p><input type="submit" value="用户注册"></p>
  14.  
    </form>
  15.  
    {% endblock %}
学新通

5、修改user下得view.py

学新通

 学新通

  1.  
    #!/usr/bin/env python
  2.  
    # -*- coding: utf-8 -*-
  3.  
    # @Time : 2021/12/14 14:25
  4.  
    # @Author : niubobo
  5.  
    # @File : view.py
  6.  
    # @Software: PyCharm
  7.  
    from flask import Blueprint, request, render_template, redirect
  8.  
     
  9.  
    from apps.user.model import User
  10.  
     
  11.  
    user_bp = Blueprint('user', __name__)
  12.  
    # 初始化一个列表保存注册用户信息
  13.  
    users = []
  14.  
     
  15.  
     
  16.  
    @user_bp.route('/')
  17.  
    def user_center():
  18.  
    return render_template('user/show.html', users=users)
  19.  
     
  20.  
     
  21.  
    @user_bp.route('/register', methods=['GET', 'POST'])
  22.  
    def register():
  23.  
    if request.method == 'POST':
  24.  
    # 获取post提交得数据
  25.  
    username = request.form.get('username')
  26.  
    password = request.form.get('password')
  27.  
    repassword = request.form.get('repassword')
  28.  
    phone = request.form.get('phone')
  29.  
    if password == repassword:
  30.  
    # 用户唯一
  31.  
    for user in users:
  32.  
    if user.username == username:
  33.  
    return render_template('user/register.html', msg = '用户名已存在')
  34.  
    # 创建用户对象
  35.  
    user = User(username, password, phone)
  36.  
    # 添加到用户列表
  37.  
    users.append(user)
  38.  
    return redirect('/')
  39.  
    return render_template('user/register.html')
  40.  
    # return '用户注册'
  41.  
     
  42.  
     
  43.  
    @user_bp.route('/login', methods=['GET', 'POST'])
  44.  
    def login():
  45.  
    return '用户登录'
  46.  
     
  47.  
     
  48.  
    @user_bp.route('/logout', methods=['GET', 'POST'])
  49.  
    def logout():
  50.  
    return '用户退出'
学新通

 6、修改user下show.html

  1.  
    {% extends 'base.html' %}
  2.  
    {% block title %}
  3.  
    用户信息
  4.  
    {% endblock %}
  5.  
    {% block middle %}
  6.  
    <h1>用户信息</h1>
  7.  
    <span>当前用户人数:{{ users|length }}人</span>
  8.  
    <table border="1" cellspacing="0" width="60%">
  9.  
    {% for user in users %}
  10.  
    <tr>
  11.  
    <td>{{ loop.index }}</td>
  12.  
    <td>{{ user.username }}</td>
  13.  
    <td>{{ user.password }}</td>
  14.  
    <td>{{ user.phone }}</td>
  15.  
    <td><a href="">修改</a> <a href="">删除</a></td>
  16.  
    </tr>
  17.  
    {% endfor %}
  18.  
     
  19.  
    </table>
  20.  
    {% endblock %}
学新通

7、修改初始化加载模板路径apps下得__init__

学新通

  1.  
    #!/usr/bin/env python
  2.  
    # -*- coding: utf-8 -*-
  3.  
    # @Time : 2021/12/11 13:52
  4.  
    # @Author : niubobo
  5.  
    # @File : __init__.py.py
  6.  
    # @Software: PyCharm
  7.  
    from flask import Flask
  8.  
    import settings
  9.  
    from apps.user.view import user_bp
  10.  
     
  11.  
     
  12.  
    def create_app():
  13.  
    app = Flask(__name__, template_folder='../templates', static_folder='../static')
  14.  
    # 加载配置
  15.  
    app.config.from_object(settings)
  16.  
    # 蓝图 ,将蓝图对象绑定到app上
  17.  
    app.register_blueprint(user_bp)
  18.  
    print(app.url_map)
  19.  
    return app
  20.  
     
  21.  
     
  22.  
    if __name__ == '__main__':
  23.  
    app = create_app()
  24.  
    app.run()
学新通

 8、启动服务

学新通

 输入正确内容点击【用户注册】

学新通

 验证用户名重复

学新通

五、实现删除

1、改造user下得view.py新增删除路由

学新通

  1.  
    #!/usr/bin/env python
  2.  
    # -*- coding: utf-8 -*-
  3.  
    # @Time : 2021/12/14 14:25
  4.  
    # @Author : niubobo
  5.  
    # @File : view.py
  6.  
    # @Software: PyCharm
  7.  
    from flask import Blueprint, request, render_template, redirect
  8.  
     
  9.  
    from apps.user.model import User
  10.  
     
  11.  
    user_bp = Blueprint('user', __name__)
  12.  
    # 初始化一个列表保存注册用户信息
  13.  
    users = []
  14.  
     
  15.  
     
  16.  
    @user_bp.route('/')
  17.  
    def user_center():
  18.  
    return render_template('user/show.html', users=users)
  19.  
     
  20.  
     
  21.  
    @user_bp.route('/register', methods=['GET', 'POST'])
  22.  
    def register():
  23.  
    if request.method == 'POST':
  24.  
    # 获取post提交得数据
  25.  
    username = request.form.get('username')
  26.  
    password = request.form.get('password')
  27.  
    repassword = request.form.get('repassword')
  28.  
    phone = request.form.get('phone')
  29.  
    if password == repassword:
  30.  
    # 用户唯一
  31.  
    for user in users:
  32.  
    if user.username == username:
  33.  
    return render_template('user/register.html', msg='用户名已存在')
  34.  
    # 创建用户对象
  35.  
    user = User(username, password, phone)
  36.  
    # 添加到用户列表
  37.  
    users.append(user)
  38.  
    return redirect('/')
  39.  
    return render_template('user/register.html')
  40.  
    # return '用户注册'
  41.  
     
  42.  
     
  43.  
    @user_bp.route('/login', methods=['GET', 'POST'])
  44.  
    def login():
  45.  
    return '用户登录'
  46.  
     
  47.  
     
  48.  
    @user_bp.route('/del')
  49.  
    def del_user():
  50.  
    # 获取传递得username
  51.  
    username = request.args.get('username')
  52.  
    print(username)
  53.  
    print(users)
  54.  
    # 根据username找到列表users当中得user对象
  55.  
    for user in users:
  56.  
    if user.username == username:
  57.  
    # 删除用户
  58.  
    users.remove(user)
  59.  
    return redirect('/')
  60.  
    else:
  61.  
    return '删除失败'
  62.  
     
  63.  
     
  64.  
    @user_bp.route('/logout', methods=['GET', 'POST'])
  65.  
    def logout():
  66.  
    return '用户退出'
  67.  
     
  68.  
     
学新通

2、修改show.html

学新通

  1.  
    {% extends 'base.html' %}
  2.  
    {% block title %}
  3.  
    用户信息
  4.  
    {% endblock %}
  5.  
    {% block middle %}
  6.  
    <h1>用户信息</h1>
  7.  
    <span>当前用户人数:{{ users|length }}人</span>
  8.  
    <table border="1" cellspacing="0" width="60%">
  9.  
    {% for user in users %}
  10.  
    <tr>
  11.  
    <td>{{ loop.index }}</td>
  12.  
    <td>{{ user.username }}</td>
  13.  
    <td>{{ user.password }}</td>
  14.  
    <td>{{ user.phone }}</td>
  15.  
    <td><a href="">修改</a> <a href="javascript:;" onclick="del('{{ user.username }}')">删除</a></td>
  16.  
    </tr>
  17.  
    {% endfor %}
  18.  
     
  19.  
    </table>
  20.  
    {% endblock %}
  21.  
    {% block myjs %}
  22.  
    <script>
  23.  
    function del(username) {
  24.  
    // console.log(username)
  25.  
    // location 地址栏对象
  26.  
    location.href = '/del?username=' username
  27.  
    }
  28.  
    </script>
  29.  
    {% endblock %}
学新通

3、启动服务注册用户进行删除

学新通

六、实现更新

1、templates/user下新增update.html

  1.  
    {% extends 'base.html' %}
  2.  
    {% block title %}用户更新{% endblock %}
  3.  
    {% block middle %}
  4.  
    <form action="{{ url_for('user.update_user') }}" method="post">
  5.  
    <p><input type="hidden" name="realname" value="{{ user.username }}"></p>
  6.  
    <p><input type="text" name="username" placeholder="用户名" value="{{ user.username }}"></p>
  7.  
    <p><input type="password" name="password" placeholder="密码" value="{{ user.password }}" disabled></p>
  8.  
    <p><input type="number" name="phone" placeholder="手机号码" value="{{ user.phone }}"></p>
  9.  
    <p><input type="submit" value="用户更新"></p>
  10.  
    </form>
  11.  
    {% endblock %}

2、修改templates/user下show.html

学新通

  1.  
    {% extends 'base.html' %}
  2.  
    {% block title %}
  3.  
    用户信息
  4.  
    {% endblock %}
  5.  
    {% block middle %}
  6.  
    <h1>用户信息</h1>
  7.  
    <span>当前用户人数:{{ users|length }}人</span>
  8.  
    <table border="1" cellspacing="0" width="60%">
  9.  
    {% for user in users %}
  10.  
    <tr>
  11.  
    <td>{{ loop.index }}</td>
  12.  
    <td>{{ user.username }}</td>
  13.  
    <td>{{ user.password }}</td>
  14.  
    <td>{{ user.phone }}</td>
  15.  
    <td><a href="javascript:;" onclick="update('{{ user.username }}')">修改</a>
  16.  
    <a href="javascript:;" onclick="del('{{ user.username }}')">删除</a></td>
  17.  
    </tr>
  18.  
    {% endfor %}
  19.  
     
  20.  
    </table>
  21.  
    {% endblock %}
  22.  
    {% block myjs %}
  23.  
    <script>
  24.  
    //删除函数
  25.  
    function del(username) {
  26.  
    // console.log(username)
  27.  
    // location 地址栏对象
  28.  
    location.href = '/del?username=' username
  29.  
    }
  30.  
    //修改函数
  31.  
    function update(username) {
  32.  
    location.href = '/update?username=' username
  33.  
    }
  34.  
    </script>
  35.  
    {% endblock %}
学新通

3、修改view.py

学新通

  1.  
    #!/usr/bin/env python
  2.  
    # -*- coding: utf-8 -*-
  3.  
    # @Time : 2021/12/14 14:25
  4.  
    # @Author : niubobo
  5.  
    # @File : view.py
  6.  
    # @Software: PyCharm
  7.  
    from flask import Blueprint, request, render_template, redirect
  8.  
     
  9.  
    from apps.user.model import User
  10.  
     
  11.  
    user_bp = Blueprint('user', __name__)
  12.  
    # 初始化一个列表保存注册用户信息
  13.  
    users = []
  14.  
     
  15.  
     
  16.  
    @user_bp.route('/')
  17.  
    def user_center():
  18.  
    return render_template('user/show.html', users=users)
  19.  
     
  20.  
     
  21.  
    @user_bp.route('/register', methods=['GET', 'POST'])
  22.  
    def register():
  23.  
    if request.method == 'POST':
  24.  
    # 获取post提交得数据
  25.  
    username = request.form.get('username')
  26.  
    password = request.form.get('password')
  27.  
    repassword = request.form.get('repassword')
  28.  
    phone = request.form.get('phone')
  29.  
    if password == repassword:
  30.  
    # 用户唯一
  31.  
    for user in users:
  32.  
    if user.username == username:
  33.  
    return render_template('user/register.html', msg='用户名已存在')
  34.  
    # 创建用户对象
  35.  
    user = User(username, password, phone)
  36.  
    # 添加到用户列表
  37.  
    users.append(user)
  38.  
    return redirect('/')
  39.  
    return render_template('user/register.html')
  40.  
    # return '用户注册'
  41.  
     
  42.  
     
  43.  
    @user_bp.route('/login', methods=['GET', 'POST'])
  44.  
    def login():
  45.  
    return '用户登录'
  46.  
     
  47.  
     
  48.  
    @user_bp.route('/del')
  49.  
    def del_user():
  50.  
    # 获取传递得username
  51.  
    username = request.args.get('username')
  52.  
    print(username)
  53.  
    print(users)
  54.  
    # 根据username找到列表users当中得user对象
  55.  
    for user in users:
  56.  
    if user.username == username:
  57.  
    # 删除用户
  58.  
    users.remove(user)
  59.  
    return redirect('/')
  60.  
    else:
  61.  
    return '删除失败'
  62.  
     
  63.  
     
  64.  
    @user_bp.route('/update', methods=['GET', 'POST'])
  65.  
    def update_user():
  66.  
    if request.method == 'POST':
  67.  
    # 这个realname目的是做主键,防止界面username对象被改了,你找不到对象做操作
  68.  
    realname = request.form.get('realname')
  69.  
    username = request.form.get('username')
  70.  
    password = request.form.get('password')
  71.  
    phone = request.form.get('phone')
  72.  
    for user in users:
  73.  
    if user.username == realname:
  74.  
    user.username = username
  75.  
    user.phone = phone
  76.  
    # return '更改成功'
  77.  
    return redirect('/')
  78.  
     
  79.  
     
  80.  
    else:
  81.  
    username = request.args.get('username')
  82.  
    for user in users:
  83.  
    if user.username == username:
  84.  
    return render_template('user/update.html', user=user)
  85.  
     
  86.  
     
  87.  
     
  88.  
     
  89.  
    @user_bp.route('/logout', methods=['GET', 'POST'])
  90.  
    def logout():
  91.  
    return '用户退出'
  92.  
     
  93.  
     
学新通

4、启动服务

注册

学新通

 修改

学新通

 查看修改结果

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfijhbg
系列文章
更多 icon
同类精品
更多 icon
继续加载