一、蓝图


1. 什么是蓝图


蓝图(blueprint):用于实现单个应用的视图、模板、静态文件的集合。

蓝图就是模块化处理的类。类似于django中app,子应用。

简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能。 在Flask中,使用蓝图可以帮助我们实现模块化应用的功能。

flask中,将项目模块化,blueprint,是flask自带的一种开发模式,目的是为了方便开发大型的项目


2. 蓝图的运行机制


蓝图是保存了一组将来可以在应用对象上执行的操作。
注册路由就是一种操作,当在程序实例上调用route装饰器注册路由时,这个操作将修改对象的url_map路由映射列表。
当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项。
当执行应用对象的 register_blueprint() 方法时,应用对象从蓝图对象的 defered_functions 列表中取出每一项,
即调用应用对象的 add_url_rule() 方法,这将会修改程序实例的路由映射列表。

  • 蓝图结构
    在这里插入图片描述

3. 运行创建的蓝图及加上路由前缀


  • 启动项目 python+文件名
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 在加上路由前缀后
    在这里插入图片描述

在这里插入图片描述

  • 必须通过加上前缀才能访问,和Django中子应用类似
    在这里插入图片描述

4. 一个项目中多个蓝图


函数名相同;先注册先访问
在这里插入图片描述
在这里插入图片描述


5. 使用蓝图构建项目


  • 目录结构
    在这里插入图片描述
    在这里插入图片描述

6. 修改文件(运行项目)


  • app/main/views.py(这个文件相当于视图,所有的函数存放文件)
    在这里插入图片描述
  • app/main/init.py(这个文件用来注册应用,实例化对象;使用蓝图)
    在这里插入图片描述
  • 在views中调用实例化对象,编写路由
    在这里插入图片描述
  • app/main/form.py(这个文件是写表单的)
  • app/init.py(这个文件进行数据库的绑定app,收集路由,CSRF验证,加载配置项等,相当于main.py)
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask_restful import Api
from flask_migrate import Migrate
from flask_wtf import CSRFProtect  ## 导入csrf保护
pymysql.install_as_MySQLdb()

csrf = CSRFProtect()
db = SQLAlchemy()
api = Api()
migrate =Migrate()


def Create():
    """
    生成flask 配置文件
    """
    app = Flask(__name__)
    ##
    import sys
    # print(sys.path)
    import os
    app.config.from_pyfile(os.path.join(sys.path[0],"settings.py"))  ## 从配置文件中加载配置
    app.config.from_object("settings.TestConfig")  # 从类中加载配置
    db.init_app(app)   ### db = Sqlalchemy(app)
    migrate.init_app(app)
    api.init_app(app)
    csrf.init_app(app)
    from app.main import main
    app.register_blueprint(main)
    return app
  • app/models.py(这个文件为模型类)
    在这里插入图片描述
  • project/manage.py(这个文件用于启动项目,数据库迁移等)
    在这里插入图片描述
  • project/settings.py(项目的配置文件)
import os
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
STATIC_PATH = os.path.join(BASE_DIR,"static")

class Product:
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True  ### 请求结束之后自动提交
    SQLALCHEMY_TRACK_MODIFICATIONS = True  ## 跟踪修改  flask 1.x 之后增加的配置项

class Config(Product):
    ## 正式环境的 配置
    SQLALCHEMY_DATABASE_URI = "mysql://root:123123@localhost/flask"  ##链接mysql 配置
    SECRET_KEY = "fdshfkjdsjfheofhihfkfjl"

class TestConfig(Product):
    ## 测试环境的配置
    SQLALCHEMY_DATABASE_URI = "mysql://root:123123@localhost/flask"  ##链接mysql 配置
    DEBUG = True
    SECRET_KEY = "fdshfkjdsjfheofhihfkfjl"

7. 项目运行中使用restful获取的接口数据页面调用问题


  • 在main/__init__.py下修改实例化对象
    在这里插入图片描述
  • 在views.py中使用路由
    在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐