【flask】使用类组织配置-使用工厂函数创建程序实例
【需求】
使用配置类管理flask管理测试环境,
通过1个参数即可控制Flask是运行develpment环境还是production环境(数据库配置,邮件配置也要根据环境的变化而变化)
【思路】
1.在config.ini中存储所有的配置信息
2.在settings.py通过DdevelopConfig,ProductionConfig类存取不同测试环境 的环境变量值
3.在app.py通过实例化DdevelopConfig或ProductionConfig类,获取这些类中的环境变量的值
在创建Flask对象app之后,通过方法app.config.from_object(obj)将配置信息写入到app.config
这样最终的效果就是:
在创建app时,通过create_app(config_name),即可灵活的切换测试环境
【代码示例】
目录结构:
config.ini
# Flask对象配置
[app]
FLASK_CONFIG=production
JSON_AS_ASCII =False
JSONIFY_MIMETYPE = "application/json;charset=utf-8"
SECRET_KEY='secret string' # 数据库配置
[sqlalchemy]
SQLALCHEMY_TRACK_MODIFICATIONS=False # 线上环境
[production]
DATABASE_URL ='mysql+mysqlconnector://username:password@ip:port/dbname?charset=utf8' # 开发环境
[development]
DATABASE_URL ='mysql+mysqlconnector://username:password@ip:port/dbname?charset=utf8' # 邮件配置信息
[email]
MAIL_SERVER="smtp.126.com"
MAIL_USERNAME='xxxx@126.com'
MAIL_PASSWORD="授权码"
settings.py
import os
from configparser import ConfigParser basedir = os.path.abspath(os.path.dirname(__file__))
cfgpath = os.path.join(basedir, 'config.ini')
cf = ConfigParser()
cf.read(cfgpath) # 获取邮件配置
def get_email_config(option):
return cf.get('email', option) # 获取邮件配置
def get_app_config(option):
return cf.get('app', option) # 获取数据库配置
def get_sqlalchemy_config(option):
return cf.get('sqlalchemy', option) # 获取生产环境配置
def get_production_config(option):
return cf.get('production', option) # 获取开发环境配置
def get_development_config(option):
return cf.get('development', option) class BaseConfig(object):
SECRET_KEY = get_app_config('SECRET_KEY') SQLALCHMEY_TRACK_MODIFICATIONS = False MAIL_SERVER = get_email_config('MAIL_SERVER')
MAIL_PORT = 465
MAIL_USE_SSL = True
MAIL_USERNAME = get_email_config('MAIL_USERNAME')
MAIL_PASSWORD = get_email_config('MAIL_USERNAME')
MAIL_DEFAULT_SENDER = ('Bluelog Admin', MAIL_USERNAME) class DevelopmentConfig(BaseConfig):
ENV = 'development'
AAA = 'in DevelopmentConfig'
SQLALCHEMY_DATABASE_URI = get_development_config('DATABASE_URL') class ProductingConfig(BaseConfig):
ENV = 'production'
AAA='in ProductingConfig'
SQLALCHEMY_DATABASE_URI = get_production_config('DATABASE_URL') config = {
'production': ProductingConfig,
'development': DevelopmentConfig
}
app.py
from flask import Flask
from settings import config,get_app_config def create_app(config_name=None):
# 不指定config_name,默认取配置文件FLASK_CONFIG的值
# 指定config_name,则以指定的环境为主
if config_name is None:
config_name=get_app_config('FLASK_CONFIG')
app = Flask(__name__)
cfobj=config[config_name]
app.config.from_object(cfobj) return app #测试不指定config_name
app = create_app()
print(app.config['FLASK_ENV'])
print(app.config['AAA'])
print('*'*50)
#测试指定config_name
app = create_app('development')
print(app.config['FLASK_ENV'])
print(app.config['AAA'])
运行结果:
production
in ProductingConfig
**************************************************
development
in DevelopmentConfig
重点:
使用该种方法组织Flask程序后,如果想单独运行models文件(使用if __name__ == '__main__'),查询数据,会报错
if __name__ == '__main__':
from flask import Flask
from flask_sqlalchemy import SQLAlchemy app = Flask(__name__)
db = SQLAlchemy(app) search_case_objs = TestCase.query.filter_by(creater='王菊')
print(search_case_objs)
报错如下:
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.
正确的调试方法:
- 运行wsgi文件
- 在Terminal中输入flask shell,在flask shell中导入从models中导入要查询的表,接下来就可以执行curd了
>>> from gotest.models import TestCase
>>> a=TestCase.query.filter_by(creater=<name>)
>>> a
<flask_sqlalchemy.BaseQuery object at 0x7f5c5087c080>
>>> type(a)
<class 'flask_sqlalchemy.BaseQuery'>
>>> a=TestCase.query.filter_by(creater=<name>).all()
>>> a
[<TestCase.a11bcdecdefd1111111111111111111111ffd>, <TestCase.获取xxxxxx评价>]
【flask】使用类组织配置-使用工厂函数创建程序实例的更多相关文章
- flask实战-个人博客-使用工厂函数创建程序实例 --
使用工厂函数创建程序实例 使用蓝本还有一个重要的好处,那就是允许使用工厂函数来创建程序实例.在OOP(Object-Oriented Programming,面向对象编程)中,工厂(factory)是 ...
- flask实战-个人博客-使用类组织配置
使用类组织配置 在实际需求中,我们往往需要不同的配置组合.例如,开发用的配置,测试用的配置,生产环境用的配置.为了能方便地在这些配置中切换,你可以把配置文件升级为包,然后为这些使用场景分别创建不同的配 ...
- Spring工厂方式创建Bean实例
创建Bean实例的方式: 1) 通过构造器(有参或无参) 方式: <bean id="" class=""/> 2) 通过静态工厂方法 方式: &l ...
- flask中用类的方式构造视图函数
from flask import Flask from flask.views import MethodView app = Flask(__name__) class IndexView(Met ...
- js工厂函数
经常会遇到工厂函数这个词,不过javascript不是严格的面向对象语言,不像java,C#拥有类,所以工厂函数会变得比较模糊. 简单来讲,就是创建一个可以用来创建实例的函数,这样每一个实例都是独立的 ...
- JavaScript中的构造函数和工厂函数说明
在cnblog上看到一篇文章,讲解JS中的构造函数和工厂函数,觉得讲的真好 JavaScript中的工厂函数和构造函数都能用来创建一个对象,我们可以来看看下面的例子 构造函数 function cre ...
- js工厂函数创建对象与对象构造函数的理解
工厂函数,顾名思义,就是通过一个"工厂的加工" 来创建一个对象的函数 //工厂函数 function createPerson(name,sex){ sex = sex == '男' ? '女' : ...
- Abstract Factory 抽象工厂(创建型模式)
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
- Python不使用元类创建缓存实例
问题 当创建类实例时我们想返回一个缓存引用,让其指向上一个用同样参数(如果有的话)创建出来的类实例. 这个问题常常出现在当我们想确保针对一组输入参数只会有一个类实例存在时. 解决方法: 使用一个与类本 ...
随机推荐
- Linux grep命令 -- 三剑客老三
常用选项 -E :开启扩展(Extend)的正则表达式. -i :忽略大小写(ignore case). -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印. -n :显示行号 -w ...
- select,poll.epoll区别于联系
select,poll,epoll都是IO多路复用中的模型.再介绍他们特点时,先来看看多路复用的 模型. 同其他IO的不同的是,IO多路复用一次可以等多个文件描述符.大大提高了等待数据准备好的时间的效 ...
- 线程池ThreadPool
在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在 ...
- Mongodb操作3-可视化工具使用
1.无密码登录 1.创建连接 输入ip后 先测试在链接 2.有密码登录 设置密码 1.选择主数据库 >>>use admin # 第一步 选择主数据 switched to db a ...
- BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]
地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
- 我说CMMI之二:CMMI里有什么?--转载
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dylanren/article/deta ...
- LOJ-6285-数列分块入门9
链接: https://loj.ac/problem/6285 题意: 给出一个长为 的数列,以及 个操作,操作涉及询问区间的最小众数. 思路: vector维护每个值的出现位置, 预处理第i快到第j ...
- C# 计时函数(毫秒)
using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading ...
- C# WCF发布服务的元数据的方式
发布服务元数据的方式有两种:一是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单text-based协议:另一种是元数据交换终结点. 1.基于HTTP-GET协议 <?xm ...
- centos7安装bower遇到的问题
Bower依赖node, npm和git. 安装nodejs遇到 Error: Package: 1:nodejs-6.11.1-1.el7.x86_64 (epel) Requires: libht ...