Flask蓝本(Blueprint)
一、动态配置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)相关推荐
- 【Python 实战基础】Flask 蓝图 Blueprint 怎么用以及怎么集成 Bootstrap
目录 一.简介 二.主要知识点 三.菜鸟实战 1.创建蓝图 2.注册蓝图 3.蓝图运行结果 4.下载和引入 Bootstrap 5.代码目录 6.Bootstrap 运行结果 一.简介 Flask ...
- Flask 蓝图 Blueprint
为什么需要蓝图? 我们在使用Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题:随着业务代码的增加,将所有代 ...
- 学习Flask之blueprint
目录结构如上图所示. epay/init.py from flask import Flask from flask_sqlalchemy import SQLAlchemy from epay.ex ...
- flask使用Blueprint
问题 一定要把项目路径导入到系统路径中 结构目录 api_blueprint.py from flask import Flask import sys import pathlib# 把当前目录加入 ...
- 【flask】Blueprint蓝图
目录 一.蓝图的作用 二.蓝图的基本使用: 三.注意事项 一.蓝图的作用 分层隔离(解耦):避免与项目同名的py文件里面有过多的指定不同内容的app.rout()会堆叠在同此文件.假设是文件处理系统里 ...
- Flask入门flask-script 蓝本 钩子函数(三)
1 flask-script扩展库 概念: 是一个flask终端运行的解析器 ,因为项目完成以后,代码改动会有风险,所以借助终端完成不同启动项的配置 安装 pip3 install flask-scr ...
- Flask restful api与blueprint结合实践
所需依赖: Flask Flask-RESTful Python2.7 备注:flask-restful不能和flask的render_template模板结合使用,因为restfulapi的设计不是 ...
- Flask框架(flask中的蓝图Blueprint)
1. 我们学习Flask框架,开始的时候是把所有的视图函数等都写在一个文件中 我们在这单个文件中可以定义路由.视图函数.定义模型等等. 但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程 ...
- python flask Blueprint搭建
随着功能的添加,路由越来越多,view层的拆分变成了刚需 蓝图的杀手锏是将你的应用组织成不同的组件,比如把这里的admin,main,course等相关的视图方法分为组件.这时我们可以 创建三个蓝图实 ...
- Web框架——Flask系列之蓝图Blueprint(二十一)
一.为什么学习蓝图? 我们学习Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题:随着业务代码的增加,将所有 ...
最新文章
- c++ 绘制函数图像_【图像增强】CLAHE 限制对比度自适应直方图均衡化
- mybatis查询如何返回ListMap类型数据
- ubuntu10.04 解决打开windows记事本.txt文件乱码的方法
- 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能
- 02-cache的基本概念原理扫盲
- SAP “麻辣三人行”小厨房|用黑科技“烹制”HR数字料理
- 杭电1597 find the nth digit
- 6 键盘高级操作技巧
- 消息中间件之JMS实践(ActiveMQ) 1
- 【C#】反射与面向接口的架构
- 30岁了开始自学编程,家里比较困难还来得及吗?
- 锂电池管理系统(BMS)-市场现状及未来发展趋势
- OpenWrt 安装中文语言包
- 使用SpringAOP拦截Feign请求动态添加参数
- WebBrowser怎么指定ie内核
- 已知分布函数求概率密度例题_高中数学必修一函数知识点总结
- Weisfeiler-Lehman(WL)算法
- 23款保时捷Panamera升级ACC、360全景影像,驾驶辅助系统等
- 录屏软件哪个好?试试这6款录屏软件,小编亲测(2023已更新)
- php实现商城购物车的思路以及源码分析