Flask - Blueprints 蓝图 - 实现模块化应用

目录

一、 Blueprints 蓝图概念

二、手动模拟蓝图模块化项目结构 - 不使用蓝图

2-1 目录结构

2-2 manage,py执行文件

2-3 __init__,py文件

2-4 views视图文件夹下视图文件

三、蓝图的实现方式

3-0 蓝图使用总结

3-0-1 蓝图内的构造URL

3-1 中小型系统的蓝图使用

扫描二维码关注公众号,回复: 5609212 查看本文章

3-1-1 目录结构

3-1-2 视图函数内实例化蓝图对象

3-1-3 __init__,py内注册蓝图

3-1-4 manage,py 执行文件

3-2 大型系统的蓝图使用

3-2-1 目录结构

3-2-2 创建蓝图对象 - 在每个项目目录下的init文件内进行初始化操作

3-2-3 在总项目init文件内进行蓝图注册

3-2-4 项目目录下的执行文件


一、 Blueprints 蓝图概念

核心:对程序进行目录结构划分,实现模块化、解耦合。

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

Flask 中的蓝图不是即插应用,因为它实际上并不是一个应用——它是可以注册,甚至可以多次注册到应用上的操作集合。

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

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

二、手动模拟蓝图模块化项目结构 - 不使用蓝图

!!!注意!!! 

!!!仅仅模拟蓝图实现思路,解释为何要使用蓝图实现模块化,无法实现蓝图的执行效果!!!

2-1 目录结构

-templates
-views
    -__init__.py
    -user.py
    -order.py
-manage.py - 项目执行文件

2-2 manage,py执行文件

# 导入views文件夹下__init__实例的Flask对象
from views import app
if __name__ == '__main__':
    app.run()

2-3 __init__,py文件

from flask import Flask,request
app = Flask(__name__)

# 必须导入,模拟蓝图注册,辅助manage执行文件内app.run()的执行
from . import account
from . import order
from . import user

2-4 views视图文件夹下视图文件

# user.py
from . import app
@app.route('/user')
def user():
    return 'user'

# order.py
from . import app
@app.route('/order')
def order():
    return 'order'

'''
!!!注意!!! 
存在严重的循环导入错误,程序无法执行,对views下的app对象重复导入。
'''

三、蓝图的实现方式

3-0 蓝图使用总结

  • xxx = Blueprint('order',__name__)  - 在视图函数内实例化蓝图对象
  • 在__init__文件内注册蓝图
  • Blueprint常用参数
    • url_prefix  - 蓝图URL前缀,类似于Django的路由分发,即在route的路径前添加url_prefix路径
      • url_prefix 的两种挂载方式
        • simple_page = Blueprint('simple_page', __name__,url_prefix='/pages')
        • app.register_blueprint(simple_page, url_prefix='/pages')
    • template_folder - 指定单独的templates文件夹路径(可自定义文件夹名),给当前蓝图对象使用。
      • admin = Blueprint('admin', __name__, template_folder='templates')
    • static_folder - 指定给当前蓝图对象使用的单独静态文件夹路径
      • admin = Blueprint('admin', __name__, static_folder='static') - 蓝图为 /admin 把静态文件夹注册到 /admin/static 。
      • url_for('admin.static', filename='style.css') 可通过反向解析生成同上的静态文件夹
  •  蓝图对象的请求扩展,仅对当前蓝图有效;例如 @befort_request

3-0-1 蓝图内的构造URL

当你想要从一个页面链接到另一个页面,你可以像通常一个样使用 url_for() 函数,只是你要在 URL 的末端加上蓝图的名称和一个点( . )作为前缀:

url_for('admin.index')

 此外,如果你在一个蓝图的视图函数或是模板中想要从链接到同一蓝图下另一个端点, 你可以通过对端点只加上一个点作为前缀来使用相对的重定向:

url_for('.index')

这个案例中,它实际上链接到 admin.index ,假如请求被分派到任何其它的 admin 蓝图端点。 

3-1 中小型系统的蓝图使用

3-1-1 目录结构

-flask_pro - 项目根目录
    -flask_test - 项目目录
        -__init__.py
        -static
        -templates
        -views
            -order.py
            -user.py
    -manage.py - 项目执行文件

3-1-2 视图函数内实例化蓝图对象

使用 Blueprint类 代替 Flask类 来创建基本对象。

'''
官方典例
'''
from flask import Blueprint, render_template, abort
from jinja2 import TemplateNotFound

# 实例化Blueprint对象
simple_page = Blueprint('simple_page', __name__,
                        template_folder='templates')

# 同Flask对象的使用方式
@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)

'''
view - 视图文件夹内视图文件
'''
# user.py
from flask import Blueprint
us = Blueprint('user',__name__)

@us.route('/login')
def login():
    return 'login'

# order.py
from flask import Blueprint
ord = Blueprint('order',__name__)

@ord.route('/test')
def test():
    return 'order test'

3-1-3 __init__,py内注册蓝图

from flask import  Flask
app = Flask(__name__)

from flask_test.views import user
from flask_test.views import order

app.register_blueprint(user.us)
app.register_blueprint(order.ord)

3-1-4 manage,py 执行文件

from flask_test import  app
if __name__ == '__main__':
    app.run()

3-2 大型系统的蓝图使用

3-2-1 目录结构

3-2-2 创建蓝图对象 - 在每个项目目录下的init文件内进行初始化操作

from flask import Blueprint

# 创建web项目的蓝图对象,指定专属的资源文件夹和模板文件夹
web = Blueprint(
    'web',
    __name__,
    template_folder='templates',
    static_folder='static'
)
from . import views

3-2-3 在总项目init文件内进行蓝图注册

from flask import Flask
from .admin import admin
from .web import web

app = Flask(__name__)
app.debug = True

# 对admin项目进行路由分发
app.register_blueprint(admin, url_prefix='/admin')
app.register_blueprint(web)

3-2-4 项目目录下的执行文件

from pro_flask import app

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

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/87636648
今日推荐