一、蓝图概述
蓝图:是flask提供的一种应用程序组织化的方法,类似的django的app,把不同功能分到不同文件,最后将这些文件汇总起来。
本质:将不同处理功能的代码分开放,再将这些代码注册到蓝图上,最后将蓝图注册到应用程序。
二、蓝图的理解和应用
案例项目结构目录如下:
""" ├── flask_blue ├── templates/ # 模版文件夹 ├── static/ # 静态文件夹 ├── apps/ # app应用程序包 ├── admin_app/ # 后台管理功能程序 - ├── __init__.py └── admin.py # 代码文件 ├── login_app/ # 登陆功能程序 ├── __init__.py └── login.py # 代码文件 └── manage.py # 主程序,类似Django的主路由 """
1、各个app下的程序代码如下
admin.py文件代码如下
from flask import Blueprint #导入蓝图模块 # Blueprint两个参数('蓝图名字',蓝图所在位置',url前缀),注意:url前缀对该蓝图下所有route都起作用 admin_blue = Blueprint('admin',__name__,url_prefix='/admin') #创建一个蓝图 @admin_blue.route('/') #该路由链接变成 /admin/ def admin(): return '后台管理界面'
admin_app初始化文件__init__.py
from apps.admin_app.admin import admin_blue # 方便使用,主程序使用时,就可以直接包名.admin_blue
login.py文件如下:
from flask import Blueprint # 导入蓝图模块 # Blueprint两个参数('蓝图名字',蓝图所在位置') login_blue = Blueprint('login', __name__) @login_blue.route('/login') def admin(): return '登陆界面'
2、apps包的初始文件__init__.py
# -*-coding:utf-8 -*- from flask import Flask # 导入蓝图 from apps.admin_app import admin_blue from apps.login_app import login_blue app = Flask(__name__) app.register_blueprint(admin_blue) #将蓝图注册到app中 app.register_blueprint(login_blue)
3、manage.py文件(主程序)
# 从apps包中导入app from apps import app if __name__ == '__main__': app.run()
在浏览器访问结果如下:
三、蓝图的其他用法
1、static_folder:设置蓝图的静态目录
# 设置静态目录 login_blue = Blueprint('login', __name__,static_folder='static_login') # 访问该蓝图的静态目录,就可以通过路径/static_login/静态目录下的文件名 # 例子:http://127.0.0.1:5000/static_login/11.jpg # 如果蓝图注册的时候设置了url_prefix,则为 url_prefix/static_login/ # 例子:http://127.0.0.1:5000/login/static_login/11.jpg
2、更改静态目录的路径(url)名称
login_blue = Blueprint('login', __name__,static_folder='static_login',static_url_path='/s') ''' 静态文件目录路径将有/static_login变成/s http://127.0.0.1:5000/static_login/11.jpg # 访问不了 http://127.0.0.1:5000/s/11.jpg # 可以访问 '''
3、设置蓝图自己的模板文件目录template_folder
login_blue = Blueprint('login', __name__,template_folder='template') @login_blue.route('/login') def admin(): return render_template('index.html') ''' 蓝图会从自己的template目录下找模板文件,找不到再去全局的templates目录中找 '''