Flask(9)- 蓝图的基本使用(下)

简介: Flask(9)- 蓝图的基本使用(下)

更具扩展性的架构


概述

随着业务代码的增加,需要为 Flask 程序提供一个具备扩展性的架构,根据 Flask 程序的扩展性分为如下三种类型:

 

1、所有的页面逻辑放在同一个文件中

在这种架构中,程序完全不具备扩展性

在初学 Flask 时,使用的栗子都是这种类型

 

2、使用一个独立的 Python 文件实现蓝图

在这种架构中,程序具备一定的扩展性:

  • 程序由主程序和多个蓝图构成
  • 每个蓝图对应一个 Python 文件
  • 所有的蓝图共享相同的模板文件目录
  • 所有的蓝图共享相同的静态文件目录

上面的栗子就是采用这种架构

程序包含 2 个蓝图: news 和 products,由 3 个文件构成:app.pynews.pyproducts.py,其中 news.py 实现新闻版块,products.py 实现产品版块

 

3、使用一个独立的目录实现蓝图

在这种架构中,程序的扩展性最好:

  • 程序由主程序和多个蓝图构成
  • 每个蓝图对应一个独立的目录,存储与这个蓝图相关的文件
  • 每个蓝图有一个独立的模板文件目录
  • 每个蓝图有一个独立的静态文件目录

 

模板文件寻找规则

每个蓝图可以拥有独立的模板文件目录,模板文件寻找规则如下:

  • 如果项目中的 templates 文件夹中存在相应的模板文件,则使用 templates 文件夹下的模板文件;
  • 如果项目中的 templates 文件夹中没有相应的模板文件,则使用定义蓝图的时候指定的 templates 文件夹下的模板文件
  • 项目中的 templates 文件夹优先级大于指定的 templates 文件夹


静态文件寻找规则

每个蓝图可以独立的静态文件目录,静态文件寻找规则如下:

  • 如果项目中的 static 文件夹中存在相应的静态文件,则使用 static 文件夹下的静态文件
  • 如果项目中的 static 文件夹中没有相应的静态文件,则使用定义蓝图的时候指定的 static 文件夹下的静态文件
  • 项目中的 templates 文件夹优先级大于指定的 templates 文件夹

 

究极扩展性的栗子


目录结构

image.png


目录功能描述

路径 功能描述
templates 项目默认的模板文件夹
static 项目默认的静态文件夹
news 蓝图 news 的相关文件
news/templates 蓝图 news 的私有模板文件夹
news/static 蓝图 news 的私有静态文件夹
products 蓝图 products 的相关文件
products/templates 蓝图 products 的私有模板文件夹
products/static 蓝图 products 的私有静态文件夹

 

文件功能描述

路径 功能描述
app.py 主程序
news/__init.py__ 蓝图 news 的实现
news/templates/society.html 属于蓝图 news 的一个模板文件
news/static/news.css 属于蓝图 news 的一个静态文件
products/__init.py__ 蓝图 products 的实现

 

app.py 的代码

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/12 10:39 下午
# file: 7_blueprint_app.py
"""
from flask import Flask
from s7_news import news
from s7_product import products
app = Flask(__name__)
app.register_blueprint(news.blueprint)
app.register_blueprint(products.blueprint)
app.run(debug=True)


news/__init.py__ 的代码

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/12 8:36 下午
"""
# 导入蓝图
from flask import Blueprint, render_template
"""
实例化蓝图对象
第一个参数:蓝图名称
第二个参数:导入蓝图的名称
第三个参数:蓝图前缀,该蓝图下的路由规则前缀都需要加上这个
"""
blueprint = Blueprint('news', __name__, url_prefix="/news", template_folder="templates", static_folder="static")
# 用蓝图注册路由
@blueprint.route("/society/")
def society_news():
    return render_template('society.html')
@blueprint.route("/tech/")
def tech_news():
    return "IT 新闻板块"


  • 蓝图中页面的 URL 前缀为 /news;
  • 蓝图的模板目录为 templates,绝对路径为 ‘项目目录 /news/templates’;
  • 蓝图的静态文件目录为 static,绝对路径为 ‘项目目录 /news/static’
  • 调用 render_template (‘society.html’) 渲染模板文件 society.html,根据模板文件的查找规则,最终在 ‘项目目录 /news/templates’ 目录下找到模板文件

 

news/templates/society.html 的代码

<link rel="stylesheet" href="{{ url_for('news.static',filename='news.css')}}">

<h1>社会新闻</h1>

在模板文件中引用了静态文件 news.css。{{url_for (‘news.static’,filename=‘news.css’) }} 的输出为 news/static/news.css,其中 news.static 表示蓝图 news 的 static 目录

 

news/static/news.css 的代码

h1 {

   color: red;

}

 

product.py/__init.py__ 的代码

from flask import Blueprint
blueprint = Blueprint('products', __name__, url_prefix='/products')
@blueprint.route("/car")
def car_products():
    return "汽车产品版块"
@blueprint.route("/baby")
def baby_products():
    return "婴儿产品版块" 


浏览器访问效果

访问 http://localhost:5000/news/society/

image.png

验证目录优先级

在根目录下的 templates 目录下也添加一个 society.html 文件,在根目录下的 static 目录下添加一个 project.css

 

html 代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<link rel="stylesheet" href="{{ url_for('static',filename='project.css') }}">
<h1>社会新闻啊啊啊</h1>
</body>
</html>


css 代码

h1 {

   color: blue;

}

 

预期结果

  • 根据 templates、static 的查找规则,会优先查找项目根目录的 templates、static 目录下是否有对应的模板文件、静态文件
  • 这里 society.html 同时出现在根目录的 templates 和蓝图目录的 templates,应该优先返回根目录的 templates 下的 society.html

 

浏览器访问效果

image.png

符合预期结果

 

Blueprint 源码解析


类初始化 __init__ 方法参数列表

image.png

  • name:蓝图名称,将会被添加到每个 endpoint
  • import_name:蓝图包的名称,通常是 __name__,有助于找到 root_path 蓝图
  • static_folder:包含静态文件的文件夹,由蓝图的静态路由提供服务,路径以蓝图文件为根路径开始找
  • static_url_path:提供静态文件的 url,默认就是 static_folder,如果蓝图没有 url_prefix,应用程序的静态路由将优先,并且蓝图的静态文件将无法访问
  • template_folder:包含模板文件的文件夹,路径以蓝图文件为根路径开始找
  • url_prefix:会作为蓝图所有路由的前缀路径
  • subdomain:蓝图路由将匹配的子域
  • url_defaults:蓝图路由的默认值字典
  • root_path:默认情况下,蓝图会自动设置这基于“import_name”
相关文章
|
10月前
|
JSON 安全 数据格式
Flask 高级应用:使用蓝图模块化应用和 JWT 实现安全认证
本文将探讨 Flask 的两个高级特性:蓝图(Blueprints)和 JSON Web Token(JWT)认证。蓝图让我们可以将应用模块化,以便更好地组织代码;而 JWT 认证是现代 Web 应用中常见的一种安全机制。
|
10月前
|
存储 安全 开发者
Flask 蓝图机制及应用
Flask 蓝图机制及应用
|
11月前
|
数据可视化 Python
Python Flask Echarts数据可视化图表实战晋级笔记(3)Blueprint蓝图解决单文件url分发
Python Flask Echarts数据可视化图表实战晋级笔记(3)Blueprint蓝图解决单文件url分发
75 0
|
11月前
|
存储 JSON 缓存
Flask框架之Restful--介绍--下载--基本使用
Flask框架之Restful--介绍--下载--基本使用
|
Python
一分钟快速实现Flask框架的蓝图和视图
一分钟快速实现Flask框架的蓝图和视图
|
调度 Python
Flask学习与项目实战4:视图高级之蓝图和子域名、类视图
对于大项目,代码都不放在app.py里面,需要分类。 即类似javaspringboot中的分层?每个功能分为一个更小规格的层次。 url_prefix 就是 蓝图的前缀。 和book相关的都在book中,和用户有关的都在user中。
Flask学习与项目实战4:视图高级之蓝图和子域名、类视图
|
Python
Flask中的blueprint 蓝图简单示例
Flask中的blueprint 蓝图简单示例
134 0
uiu
|
存储 安全 前端开发
【Flask】 一个案例学会 Flask 蓝图(Blueprint)
【Flask】 一个案例学会 Flask 蓝图(Blueprint)
uiu
158 0
【Flask】 一个案例学会 Flask 蓝图(Blueprint)
|
API Python
Python全栈:flask的blueprint蓝图使用
Python全栈:flask的blueprint蓝图使用
149 0