蓝图的介绍


蓝图的作用就是为Flak项目提供目录结构的划分

蓝图的目录结构


├── 项目名
│   ├── 项目名
│   │   ├── __init__.py # flask 初始化文件
│   │   ├── static# 静态资源文件夹
│   │   │   ├── xxx.jpg        
│   │   │   └── xxx.jpg
│   │   ├── templates # 模板文件夹
│   │   │   ├── xxx.html       
│   │   │   └── xxx.html
│   │   ├── views # 视图文件夹
│   │   │   ├── xxx.py        
│   │   │   └── xxx.py
│   └── manage.py # 启动文件


蓝图的基本使用


注意: 蓝图对象的变量名不能有重复

  • 视图

# crm/crm/views/account.py

from flask import Blueprint, render_template

ac = Blueprint(name='ac', import_name=__name__)  # 实例化蓝图对象


@ac.route('/login')  # 使用蓝图对象注册路由
def login():
    return render_template('login.html')


@ac.route('/logout')  # 使用蓝图对象注册路由
def logout():
    return render_template('login.html')

# crm/crm/views/user.py

from flask import Blueprint, render_template

uc = Blueprint(name='uc', import_name=__name__)  # 实例化蓝图对象


@uc.route('/lis')  # 使用蓝图对象注册路由
def lis():
    return render_template('user_list.html')


@uc.route('/detail')  # 使用蓝图对象注册路由
def detail():
    return render_template('user_detail.html')

  • flask 初始化文件

# crm/crm/__init__.py

from flask import Flask
from .views.account import ac
from .views.user import uc


def create_app():
    app = Flask(__name__)

# 注册蓝图(即: 将蓝图对象与flask的app对象绑定关系)
    app.register_blueprint(ac)
    app.register_blueprint(uc)

    return app

  • 启动文件

# crm/manage.py

from crm import create_app

app = create_app()

if __name__ == '__main__':
    app.run()  # 启动 Flask

蓝图的常用配置参数


蓝图的配置只会作用于当前蓝图下的所有视图函数或视图类

1. 蓝图的常用配置

# 蓝图的常用配置

Blueprint(
    name='ac',  # 蓝图的名字
    import_name=__name__,  # 蓝图所在的模块或者包
    template_folder='../pages',  # 模板文件夹的路径(即: 修改所使用的模板文件夹),模板查询顺序: Flask 先会去 templates 文件夹里面找,如果没有再去你所指定的 pages 文件夹里面找
    static_folder='../static_folder',  # 静态文件夹的路径(即: 修改所使用的静态文件夹),静态文件查询顺序: Flask 先会去 static 文件夹里面找,如果没有再去你所指定的 static_folder 文件夹里面找
    static_url_path='/static',  # 配置静态文件夹路径前缀,默认值为 None,如果不配置 html 模板默认使用 static 静态文件夹路径
    url_prefix='/user',  # url前缀,即: 访问当前蓝图的所有路由的时候都要加上该前缀 http://127.0.0.1:5000/user/login
    subdomain=None,  # 子域名的配置
)

2. template_folder

  • 模板文件夹的路径(即: 修改所使用的模板文件夹)

  • 模板查询顺序: Flask 先会去 templates 文件夹里面找,如果没有再去你所指定的 pages 文件夹里面找

# crm/crm/views/account.py

from flask import Blueprint, render_template

ac = Blueprint(name='ac', import_name=__name__, template_folder='../pages')  # 注意模板文件夹的路径在哪里


@ac.route('/login')
def login():
    return render_template('login.html')


@ac.route('/logout')
def logout():
    return render_template('login.html')


3. static_folder 和 static_url_path

  • static_folder 和 static_url_path 一般都是搭配着使用否则会无效

  • static_folder: 静态文件夹的路径(即: 修改所使用的静态文件夹)

  • static_url_path: 配置静态文件夹路径前缀,默认值为 None,如果不配置 html 模板默认使用 static 静态文件夹路径

  • 静态文件查询顺序: 
    • 例如: /abc/style.css
    • 先查询 /abc 是否是指定的前缀
    • 如果 /abc 是指定的前缀 -> 将 /abc 前缀转换为它所指定的静态文件夹路径,然后拼接上 /style.css 访问
    • 如果 /abc 不是指定的前缀 -> 直接使用 /abc/style.css 进行访问

# app.py

from flask import Blueprint, render_template

ac = Blueprint(
    name='ac',
    import_name=__name__,
static_folder='../static_new',  # 注意静态文件夹的路径在哪里
static_url_path='/abc'  # 前缀一定要加 /
)


@ac.route('/login')
def login():
    return render_template('login.html')


@ac.route('/logout')
def logout():
    return render_template('login.html')

# xxx.html

<link rel="stylesheet" href="/abc/style.css"> <!-- 先查询 /abc 前缀所指定静态文件夹,然后拼接上 style.css 进行访问 -->

<link rel="stylesheet" href="/static/style.css"> <!-- 因为 /static 不是前缀,所以直接 /static/style.css 进行访问 -->


蓝图的url前缀设置


1. 蓝图设置url前缀方式一

  • 在实例化蓝图对象时设置url前缀

# crm/crm/views/account.py

from flask import Blueprint, render_template

ac = Blueprint(
    name='ac',
    import_name=__name__,
url_prefix='/user',  # url前缀,即: 访问当前蓝图的所有路由的时候都要加上该前缀
)


# http://127.0.0.1:5000/user/login
@ac.route('/login')
def login():
    return render_template('login.html')


# http://127.0.0.1:5000/user/logout
@ac.route('/logout')
def logout():
    return render_template('login.html')

2. 蓝图设置url前缀方式二

  • 注册蓝图(即: 将蓝图对象与flask的app对象绑定关系)时设置url前缀

# crm/crm/views/account.py

from flask import Blueprint, render_template

ac = Blueprint('ac', __name__)


# http://127.0.0.1:5000/user/login
@ac.route('/login')
def login():
    return render_template('login.html')


# http://127.0.0.1:5000/user/logout
@ac.route('/logout')
def logout():
    return render_template('login.html')

# crm/crm/__init__.py

from flask import Flask
from .views.account import ac


def create_app():
    app = Flask(__name__)

# 注册蓝图(即: 将蓝图对象与flask的app对象绑定关系)
    app.register_blueprint(ac, url_prefix='/user')

    return app

蓝图的子域名设置


1. 添加子域名

  • 添加子域名



2. 刷新子域名

  • ipconfig /flushdns


3. 编写蓝图子域名访问

  • 编写蓝图子域名访问

# crm/crm/views/account.py

from flask import Blueprint, render_template

ac = Blueprint(name='ac', import_name=__name__, subdomain='admin')


# http://admin.kevin.com:5000/login
@ac.route('/login')
def login():
    return render_template('login.html')


# http://admin.kevin.com:5000/logout
@ac.route('/logout')
def logout():
    return render_template('login.html')

# crm/crm/__init__.py

from flask import Flask
from .views.account import ac


def create_app():
    app = Flask(__name__)

app.config['SERVER_NAME'] = 'kevin.com:5000'  # 配置域名 + 端口,一定要添加该配置,否则无法生效

    app.register_blueprint(ac)  # 注册蓝图(即: 将蓝图对象与flask的app对象绑定关系)
    return app

在蓝图中使用特殊装饰器


  • 注意: 该栏目只使用 before_request 特殊装饰器举例,其他特殊装饰器都是同理的

1. 全局的特殊装饰器

  • 作用于所有视图函数或视图类

# crm/crm/__init__.py

from flask import Flask
from .views.account import ac
from .views.user import uc


def create_app():
    app = Flask(__name__)

# 全局特殊装饰器,作用于所有视图函数或视图类
@app.before_request
    def x1():
        print('global_special_decorator')

# 注册蓝图(即: 将蓝图对象与flask的app对象绑定关系)
    app.register_blueprint(ac)
    app.register_blueprint(uc)

    return app

2. 局部的特殊装饰器

  • 只作用于当前蓝图下的视图函数或视图类

# crm/crm/views/account.py

from flask import Blueprint, render_template

ac = Blueprint(name='ac', import_name=__name__)


# 局部特殊装饰器,作用于当前蓝图下的视图函数或视图类
@ac.before_request
def x1():
    print('local_special_decorator')


@ac.route('/login')
def login():
    return render_template('login.html')


@ac.route('/logout')
def logout():
    return render_template('login.html')

小型程序和大型程序的目录结构


1. 小型程序

small_project_crm.rar

  • 目录结构

├── 项目名
│   ├── 项目名
│   │   ├── __init__.py # flask 初始化文件
│   │   ├── static# 静态资源文件夹
│   │   │   ├── xxx.jpg        
│   │   │   └── xxx.jpg
│   │   ├── templates # 模板文件夹
│   │   │   ├── xxx.html       
│   │   │   └── xxx.html
│   │   ├── views # 视图文件夹
│   │   │   ├── xxx.py        
│   │   │   └── xxx.py
│   └── manage.py # 启动文件


  • 视图

# crm/crm/views/account.py

from flask import Blueprint, render_template

ac = Blueprint(name='ac', import_name=__name__)  # 实例化蓝图对象


@ac.route('/login')  # 使用蓝图对象注册路由
def login():
    return render_template('login.html')


@ac.route('/logout')  # 使用蓝图对象注册路由
def logout():
    return render_template('login.html')

# crm/crm/views/user.py

from flask import Blueprint, render_template

uc = Blueprint(name='uc', import_name=__name__)  # 实例化蓝图对象


@uc.route('/lis')  # 使用蓝图对象注册路由
def lis():
    return render_template('user_list.html')


@uc.route('/detail')  # 使用蓝图对象注册路由
def detail():
    return render_template('user_detail.html')

  • flask 初始化文件

# crm/crm/__init__.py

from flask import Flask
from .views.account import ac
from .views.user import uc


def create_app():
    app = Flask(__name__)

# 注册蓝图(即: 将蓝图对象与flask的app对象绑定关系)
    app.register_blueprint(ac)
    app.register_blueprint(uc)

    return app

  • 启动文件

# crm/manage.py

from crm import create_app

app = create_app()

if __name__ == '__main__':
    app.run()  # 启动 Flask

  • 所生成的url路径

http://127.0.0.1:5000/login
http://127.0.0.1:5000/logout
http://127.0.0.1:5000/lis
http://127.0.0.1:5000/detail

8. 大型程序

big_project_crm.rar

  • 目录结构

├── 项目名
│   ├── 项目名
│   │   ├── __init__.py # flask 初始化文件
│   │   ├── app01  
│   │   │   ├── static# 静态资源文件夹
│   │   │   │   ├── xxx.jpg        
│   │   │   │   └── xxx.jpg
│   │   │   ├── templates # 模板文件夹
│   │   │   │   ├── xxx.html       
│   │   │   │   └── xxx.html
│   │   │   ├── __init__.py # app 初始文件
│   │   │   └── views.py# 视图文件
│   │   ├── app02
│   │   │   ├── static           # 静态资源文件夹
│   │   │   │   ├── xxx.jpg        
│   │   │   │   └── xxx.jpg
│   │   │   ├── templates        # 模板文件夹
│   │   │   │   ├── xxx.html       
│   │   │   │   └── xxx.html
│   │   │   ├── __init__.py  # app 初始文件
│   │   │   └── views.py  # 视图文件
│   └── manage.py # 启动文件


  • admin 的视图

# crm/crm/admin/__init__.py

from flask import Blueprint

# 实例化蓝图对象
admin = Blueprint(
    'admin',
    __name__,
    template_folder='templates',
    static_folder='static'
)

# 导入视图函数
from . import views

# crm/crm/admin/views.py

from . import admin


@admin.route('/index')  # 使用蓝图对象注册路由
def index():
    return 'Admin.Index'

  • web 的视图

# crm/crm/web/__init__.py

from flask import Blueprint

# 实例化蓝图对象
web = Blueprint(
    'web',
    __name__,
    template_folder='templates',
    static_folder='static'
)

# 导入视图函数
from . import views

# crm/crm/web/views.py

from . import web


@web.route('/index')  # 使用蓝图对象注册路由
def index():
    return 'Web.Index'

  • flask 初始化文件

# crm/crm/__init__.py

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


def create_app():
    app = Flask(__name__)

# 注册蓝图(即: 将蓝图对象与flask的app对象绑定关系)
    app.register_blueprint(admin, url_prefix='/admin')
    app.register_blueprint(web, url_prefix='/web')

    return app

  • 启动文件

# crm/manage.py

from crm import create_app

app = create_app()

if __name__ == '__main__':
    app.run()  # 启动 Flask

  • 所生成的url路径

http://127.0.0.1:5000/admin/index
http://127.0.0.1:5000/web/index