Flask Blueprint 蓝图
蓝图介绍
- 蓝图:
蓝图的存在的目的,就是为了给开发者提供一个目录结构; - 简单的示例: |-crm |-crm |-__init__.py |-views |-accout.py |-user.py |-... |-templates |-static |-manage.py
- 目录结构的简单分析:
- 目录结构解析: - __init__.py 文件中用来实例化 Flask对象,并且注册blueprint - 导入视图函数中实例化的Blueprint对象 - 注册blueprint: app.register_blueprint(Blueprint对象) - 为某一个视图函数添加前缀: app.register_blueprint(Blueprint对象, url_prefix="/xxx") - views文件用来写路由的逻辑, - 里面的py文件中,此时需要实例化 Blueprint对象 - templates 放模板 - static 放静态文件 - manage.py 作为入口文件。导入 __init__ 里面的实例化Flask对象.run()
创建蓝图
- 蓝图实际上也可以理解为是一个 不能执行 run() 的Flask对象,基本用法与Flask一样:
- 创建蓝图示例:
# 导入蓝图 from flask import Blueprint # 实例化蓝图对象 app = Blueprint("get", __name__, url_prefix="/student") # 注册路由,视图函数 @app.route("/get_students", strict_slashes=False) def get(): return "hello, get all students"
- Blueprint类:
- 参数解析:
name:是该蓝图的唯一标识;反向解析时,能够准确的找到蓝图下的视图url
import_name: 当前的文件名
url_prefix: 路由前缀;区分路由
...
其他的与Flask类的参数一致;
- __init__ 源码:
def __init__(self, name, import_name, static_folder=None, static_url_path=None, template_folder=None, url_prefix=None, subdomain=None, url_defaults=None, root_path=None): _PackageBoundObject.__init__(self, import_name, template_folder, root_path=root_path) self.name = name self.url_prefix = url_prefix self.subdomain = subdomain self.static_folder = static_folder self.static_url_path = static_url_path self.deferred_functions = [] if url_defaults is None: url_defaults = {} self.url_values_defaults = url_defaults
- Flask中注册蓝图:
- app.register_blueprint(蓝图对象)
- 每创建一个蓝图就需要在Flask的实例对象中进行注册;
- 实例:
""" main.py """ from flask import Flask from blueprint import get app = Flask(__name__) app.config.from_object(DebugSetting) app.register_blueprint(get.app) if __name__ == '__main__': app.run() """ ./blueprint/get.py """ # 导入蓝图 from flask import Blueprint # 实例化蓝图对象 app = Blueprint("get", __name__, url_prefix="/student") # 注册路由,视图函数 @app.route("/get_students", strict_slashes=False) def get(): return "hello, get all students"
蓝图中的视图
- 注册视图与路由时与正常的相同;
- 注意访问时,蓝图中是否加有前缀;(url_prefix参数)
- strict_slashes:对于路由最后的斜杠是否要求
- False 不要求
- True 要求