一、动态配置Flask app

  在使用单个文件开发Flask应用程序时,由于Flask对象app是在全局作用域中创建的,在运行这个全局文件脚本时,app就已经创建,所以此时修改app的配置是不会生效的。为了解决这个问题可以把app的创建移到可显式调用的工厂函数中,即延迟创建app实例。

工厂函数:app/__init__.py

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CSRFProtectfrom config import configdb = SQLAlchemy()
csrf = CSRFProtect()# 创建Flask实例,注册第三方扩展,调用config.init_app初始化
def create_app(config_name):app = Flask(__name__)app.config.from_object(config[config_name])config[config_name].init_app(app)db.init_app(app)   # 注册第三方扩展csrf.init_app(app)return app  # 返回app实例

此时调用create_app()即可动态传入config_name参数实现动态配置。

二、使用蓝本

  使用工厂函数创建app实例可以解决了动态配置的问题,但是程序路由应该如何配置呢?我们在使用单个文件开发Flask程序时,在全局作用域创建了app实例,直接使用app.route就可配置路由,而现在app实例的创建已经移到工厂函数中进行了,只有调用工厂函数create_app后才能使用app实例,然而我们的路由函数在编写程序时已经定义好了,也就是说在编写路由函数时是无法获取到app实例的,也就无法定义路由配置。通用的所有需要在编码时使用app实例的配置此时都无法使用。

为了解决这个问题flask提供了蓝本。
蓝本:app/main/__init__.py

from flask import Blueprintmain = Blueprint('main', __name__)  # 创建蓝本from . import  views   # 在views定义程序的路由

在views中定义的程序路由只有在蓝本注册到app实例上后才有效。

# 创建Flask实例,注册第三方扩展,调用config.init_app初始化
def create_app(config_name):app = Flask(__name__)app.config.from_object(config[config_name])config[config_name].init_app(app)db.init_app(app)csrf.init_app(app)from .main import main as main_blueprint  # 导入蓝本app.register_blueprint(main_blueprint)  # 注册蓝本return app

完整的(app/__init__.py)

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CSRFProtectfrom config import configdb = SQLAlchemy()
csrf = CSRFProtect()# 创建Flask实例,注册第三方扩展,调用config.init_app初始化
def create_app(config_name):app = Flask(__name__)app.config.from_object(config[config_name])config[config_name].init_app(app)db.init_app(app)csrf.init_app(app)#注册蓝本from .main import main as main_blueprintfrom .auth import auth as auth_blueprintapp.register_blueprint(main_blueprint)app.register_blueprint(auth_blueprint, url_prefix = '/auth')return app

views.py

from datetime import datetimefrom flask import render_template, session, redirect, url_forfrom . import main # 导入蓝本@main.route('/home', methods = ['GET', 'POST']) # 定义路由
def index():return render_template('welcome.html')

三、定义程序启动脚本

manage.py

import osfrom flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommandfrom app import create_app
from app import dbapp = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
migrate = Migrate(app, db)def make_shell_context():return dict(app=app, db=db)manager.add_command('shell', Shell( make_context = make_shell_context() ) )
manager.add_command('db', MigrateCommand)if __name__ == '__main__':manager.run()

在定义程序脚本时需要使用Flask-Script和Flask-Migrate包。运行python manage.py即可启动程序。

四、完整的项目结构

|-- myproject|-- config.py|-- flask-env.yml|-- manage.py|-- app|   |-- models.py|   |-- __init__.py   # 创建app实例的工厂函数|   |-- auth  # auth蓝本|   |   |-- forms.py|   |   |-- views.py|   |   |-- __init__.py|   |   |-- templates|   |-- main   # main蓝本|   |   |-- errors.py|   |   |-- forms.py|   |   |-- views.py|   |   |-- __init__.py|   |-- static|   |   |-- css|   |   |-- image|   |   |-- js|   |-- templates|-- migrations|-- tests|   |-- __init__.py|-- venv

五、动态配置类

config.py

import os
basedir = os.path.abspath(os.path.dirname(__file__))# 通用配置
class Config:WTF_CSRF_SECRET_KEY = os.environ.get('WTF_CSRF_SECRET_KEY') or 'ao blog csrf key'SECRET_KEY = os.environ.get('SECRET_KEY') or 'ao blog session key'SQLALCHEMY_COMMIT_ON_TEARDOWN = TrueSQLALCHEMY_TRACK_MODIFICATIONS = False# 初始化Flask实例,对当前环境的配置初始化@staticmethoddef init_app(app):app.config['SECRET_KEY'] = SQLALCHEMY_COMMIT_ON_TEARDOWNapp.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = SQLALCHEMY_COMMIT_ON_TEARDOWNapp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_COMMIT_ON_TEARDOWNapp.config['WTF_CSRF_SECRET_KEY'] = SQLALCHEMY_COMMIT_ON_TEARDOWN# 开发环境配置
class DevelopmentConfig(Config):DEBUG = True# SQLALCHEMY_TRACK_MODIF = TrueSQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')class TestingConfig(Config):TESTING = TrueSQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')class ProductionConfig(Config):SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')config = {'dev': DevelopmentConfig,'test': TestingConfig,'prod': ProductionConfig,'default': DevelopmentConfig
}

Flask蓝本(Blueprint)相关推荐

  1. 【Python 实战基础】Flask 蓝图 Blueprint 怎么用以及怎么集成 Bootstrap

    目录 一.简介 二.主要知识点 三.菜鸟实战 1.创建蓝图 2.注册蓝图 3.蓝图运行结果 ​4.下载和引入 Bootstrap 5.代码目录 6.Bootstrap 运行结果 一.简介 Flask ...

  2. Flask 蓝图 Blueprint

    为什么需要蓝图? 我们在使用Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题:随着业务代码的增加,将所有代 ...

  3. 学习Flask之blueprint

    目录结构如上图所示. epay/init.py from flask import Flask from flask_sqlalchemy import SQLAlchemy from epay.ex ...

  4. flask使用Blueprint

    问题 一定要把项目路径导入到系统路径中 结构目录 api_blueprint.py from flask import Flask import sys import pathlib# 把当前目录加入 ...

  5. 【flask】Blueprint蓝图

    目录 一.蓝图的作用 二.蓝图的基本使用: 三.注意事项 一.蓝图的作用 分层隔离(解耦):避免与项目同名的py文件里面有过多的指定不同内容的app.rout()会堆叠在同此文件.假设是文件处理系统里 ...

  6. Flask入门flask-script 蓝本 钩子函数(三)

    1 flask-script扩展库 概念: 是一个flask终端运行的解析器 ,因为项目完成以后,代码改动会有风险,所以借助终端完成不同启动项的配置 安装 pip3 install flask-scr ...

  7. Flask restful api与blueprint结合实践

    所需依赖: Flask Flask-RESTful Python2.7 备注:flask-restful不能和flask的render_template模板结合使用,因为restfulapi的设计不是 ...

  8. Flask框架(flask中的蓝图Blueprint)

    1. 我们学习Flask框架,开始的时候是把所有的视图函数等都写在一个文件中 我们在这单个文件中可以定义路由.视图函数.定义模型等等. 但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程 ...

  9. python flask Blueprint搭建

    随着功能的添加,路由越来越多,view层的拆分变成了刚需 蓝图的杀手锏是将你的应用组织成不同的组件,比如把这里的admin,main,course等相关的视图方法分为组件.这时我们可以 创建三个蓝图实 ...

  10. Web框架——Flask系列之蓝图Blueprint(二十一)

    一.为什么学习蓝图? 我们学习Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题:随着业务代码的增加,将所有 ...

最新文章

  1. c++ 绘制函数图像_【图像增强】CLAHE 限制对比度自适应直方图均衡化
  2. mybatis查询如何返回ListMap类型数据
  3. ubuntu10.04 解决打开windows记事本.txt文件乱码的方法
  4. 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能
  5. 02-cache的基本概念原理扫盲
  6. SAP “麻辣三人行”小厨房|用黑科技“烹制”HR数字料理
  7. 杭电1597 find the nth digit
  8. 6 键盘高级操作技巧
  9. 消息中间件之JMS实践(ActiveMQ) 1
  10. 【C#】反射与面向接口的架构
  11. 30岁了开始自学编程,家里比较困难还来得及吗?
  12. 锂电池管理系统(BMS)-市场现状及未来发展趋势
  13. OpenWrt 安装中文语言包
  14. 使用SpringAOP拦截Feign请求动态添加参数
  15. WebBrowser怎么指定ie内核
  16. 已知分布函数求概率密度例题_高中数学必修一函数知识点总结
  17. Weisfeiler-Lehman(WL)算法
  18. 23款保时捷Panamera升级ACC、360全景影像,驾驶辅助系统等
  19. 录屏软件哪个好?试试这6款录屏软件,小编亲测(2023已更新)
  20. php实现商城购物车的思路以及源码分析

热门文章

  1. 微信小程序开发学习3(WXSS模板和全局配置)
  2. 去掉UISearchBar自带的的边框背景
  3. Google IO 2022——CSS 状态
  4. 吴式太极大师战波简介
  5. 最近在测FREEBSD平台下ISP邮件系统前的准备知识摘录
  6. 抗生素对微生物组和人体健康的影响
  7. java设计模式之假设要实现一个RPG游戏系统框架的部分功能
  8. 创建Web站点的欢迎页面
  9. Photoshop技能167个经典的Photoshop技巧大全
  10. 809-Expressive Words