Flask蓝图

文章介绍了Flask蓝图在项目管理中的作用,如何通过蓝图解决单一app.py文件导致的管理不便,以及不使用蓝图时手动分化目录的方法。蓝图允许更清晰的目录结构,每个蓝图可独立配置路由、静态文件和模板文件夹。文章还提供了小型和大型项目中使用蓝图的示例。

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

蓝图所解决的场景

在最原始的 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 文件就可以的情况

  1. 蓝图对象初始化–由于非大型文件,蓝图的初始化和调用都在视图文件中进行
  2. 蓝图对象的注册,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 的情况

  1. 蓝图对象初始化–蓝图的初始化在各个应用文件中init.py进行,同时还需要再init.py中对视图文件views.py进行注册,同时注册要放在初始化蓝图之后,防止循环导入
  2. 蓝图的使用–各个应用中的views.py要再导入注册的蓝图对象才能使用
  3. 蓝图对象的注册,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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值