蓝图所解决的场景
在最原始的 flask 项目中,我们都是在一个
app.py
中完成所有的开发:路由、视图、模型这很明显并不是一个合格的项目目录的管理办法
蓝图就是为了方便项目目录管理,以及方便分化目录之后的路由规划
不使用蓝图,手动分化目录
项目结构
├─static
├─templates
├─views
├─__init__.py
├─account.py
└─order.py
└─app.py
app.py
–项目启动文件,只负责
from views import app
if __name__ == '__main__':
app.run()
init.py
–初始化项目的整个 app 对象, 注册视图层
视图层的注册要放在 app初始化的下面!
不注册视图层的话,不会执行
from flask import Flask,request
app = Flask(__name__,template_folder='../templates')
#不 导入这个不行
from . import account
from . import order
from . import user
order.py
--导入初始化的 app对象,写视图函数
from . import app
@app.route('/order')
def order():
return 'order'
总结:
由于全局就一个app, 所以每一个视图层都要导入这个 app,并且再注册
同时一个 app, 无法分开配置 templates、static 文件夹,全局就只能用一个
蓝图的使用说明
所以,基于应用划分文件夹之后,就可以使用蓝图来替代app对象的使用
每一个蓝图对象可以分别进行路由注册,类似于 Django 中的路由分发
每一个蓝图都有自己的请求拓展
蓝图的初始化:
b = Blueprint(name:str, import_name:str)
**蓝图的注册:**先导入初始化的蓝图对象,再在app中进行注册
app.register_blueprint()
**蓝图的使用:**与
app
对象的使用相同,url_prefix='/prefix'
相当于路由分发
# 参数说明
name:蓝图的名称。必须是唯一的,以便 Flask 能够正确地处理请求和 URL。
import_name:蓝图所在的包或模块的名称,用于定位蓝图的资源。
url_prefix:指定蓝图的 URL 前缀,这个前缀会被添加到蓝图中定义的所有 URL 中。
static_folder:指定蓝图中静态文件的存储路径。
template_folder:指定蓝图中模板文件的存储路径。
subdomain:指定蓝图所在的子域名。
url_defaults:为蓝图中所有视图函数提供默认的 URL 参数。
root_path:蓝图所在的应用程序的根路径。
使用蓝图的小型项目
使用方法:
由于是小型项目,考虑只需要一个 static,templates 文件就可以的情况
- 蓝图对象初始化–由于非大型文件,蓝图的初始化和调用都在视图文件中进行
- 蓝图对象的注册,app对象的初始化–由于蓝图初始化在各个视图文件中,所以在 app 对象初始化之后,需要再导入视图文件中的蓝图对象,进行蓝图注册
└─项目目录
├─app01
├─static #静态文件
├─templates #模板文件
└─order.html
├─views #视图层
├─account.py # 在每一个视图文件中初始化一个蓝图对象
└─order.py
└─__init__.py #用于初始化总的app对象,并导入各个子视图中的 blueprint对象
└─manage.py #启动文件
manage.py
from app01 import app
if __name__ == '__main__':
app.run()
app01/__init__.py
–初始化总的app对象,并导入各个子视图中的 blueprint对象
from flask import Flask
app = Flask(__name__,template_folder='templates',static_folder='statics',static_url_path='/static')
from .views.account import account
from .views.blog import blog
# 注册3个蓝图,把他们注册进app中
app.register_blueprint(account)
app.register_blueprint(blog)
app01/views/account.py
from flask import Blueprint
from flask import render_template
# 实例化得到蓝图对象
account = Blueprint('account', __name__)
@account.route('/login.html', methods=['GET', "POST"])
def login():
return render_template('login.html')
app01/views/order.py
from flask import Blueprint, render_template,request
order = Blueprint('order', __name__)
@order.route('/get_order')
def get_order():
print(request.path)
return render_template('order.html')
使用蓝图的大型项目
使用方法:
由于是大型项目,每个应用需要一个 static,templates 的情况
- 蓝图对象初始化–蓝图的初始化在各个应用文件中
init.py
进行,同时还需要再init.py
中对视图文件views.py
进行注册,同时注册要放在初始化蓝图之后,防止循环导入- 蓝图的使用–各个应用中的
views.py
要再导入注册的蓝图对象才能使用- 蓝图对象的注册,app对象的初始化–由于蓝图初始化在各个应用的
init.py
文件中,所以在 app 初始化之后,需要再导入各个应用包中的蓝图对象
└─项目目录
├─pro_flask
├─__init__.py
├─app_order
├─__init__.py #单独初始化每个子应用的 blueprint对象, 同时注册视图层文件
├─views.py #视图层
├─static #静态文件
├─templates #模板文件
└─order.html
└─__init__.py #用于初始化总的app对象,并导入各个子视图中的 blueprint对象
└─app_account
├─__init__.py #单独初始化每个子应用的 blueprint对象, 同时注册视图层文件
├─views.py #视图层
├─static #静态文件
├─templates #模板文件
└─order.html
└─__init__.py #用于初始化总的app对象,并导入各个子应用中的 blueprint对象
└─manage.py #启动文件
manage.py
from pro_flask import app
if __name__ == '__main__':
app.run()
pro_flask/__init__.py
–初始化总的app对象,并导入各个子应用中的 blueprint对象
from flask import Flask
from .admin import admin
from .web import web
app = Flask(__name__)
app.debug = True
# 第二步:在app中注册蓝图
app.register_blueprint(admin, url_prefix='/admin') # url_prefix='/admin' 访问这个app的前缀,等同于include
app.register_blueprint(web)
pro_flask/app_order/__init__.py
from flask import Blueprint
# 第一步:初始化蓝图
app_order = Blueprint(
'app_order',
__name__,
template_folder='templates', # 指定该蓝图对象自己的模板文件路径
static_folder='static' # 指定该蓝图对象自己的静态文件路径
)
from . import views
pro_flask/app_order/views.py
from . import app_order
from flask import render_template
@app_order.before_request
def before():
print('app_order 的 before')
# 第三步:使用蓝图注册路由
@app_order.route('/index')
def index():
return render_template('app_order.html')
pro_flask/app_account/__init__.py
from flask import Blueprint
app_account = Blueprint(
'app_account',
__name__,
template_folder='templates',
static_folder='static'
)
from . import views
pro_flask/app_account/views.py
from . import web
@app_account.route('/index')
def index():
return 'app_account.Index'