曾经在《FLask灵活管理多种场景下的配置》这篇文章里,已经详细阐述过 FLask 如何读取配置,以及多个环境下如何选择配置,这一次主要讲讲在项目中几个重要的配置,以及在多环境下如何管理基础配置和机要配置(安全性更高的配置)。
项目配置可分为基础配置、开发配置、生产配置。
# config/base.py
class BaseConfig(object):
# --- 密钥配置 ---
SECRET_KEY = os.getenv('SECRET_KEY', 'Hello, Flask-Tea!!!')
EXPIRES_IN = 86400 * 30
# --- SQLAlchemy配置 ---
SQLALCHEMY_DATABASE_URI = os.getenv(
'SQLALCHEMY_DATABASE_URI',
'mysql+cymysql://root:123456@127.0.0.1:3306/tea?charset=utf8mb4'
)
SQLALCHEMY_ENCODING = "utf8mb4"
# 关闭追踪对象修改信号
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 启用慢查询记录
SQLALCHEMY_RECORD_QUERIES = True
# 连接池选项
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_size': 50,
'max_overflow': 10,
'pool_recycle': 1800,
'pool_timeout': 60,
'pool_pre_ping': True
}
# config/development.py
class DevelopmentConfig(BaseConfig):
# 启用SQL语句回显
SQLALCHEMY_ECHO = True
# config/production.py
class ProductionConfig(BaseConfig):
# 关闭SQL语句回显
SQLALCHEMY_ECHO = False
对于数据库的配置,Flask-SQLAlchemy 官方提供了一些配置项如下:
配置项 | 作用 |
---|---|
SQLALCHEMY_DATABASE_URI |
用于连接数据的数据库。例如:* sqlite:////tmp/test.db * mysql://username:password@server/db |
SQLALCHEMY_BINDS |
一个映射绑定 (bind) 键到 SQLAlchemy 连接 URIs 的字典。 更多的信息请参阅 绑定多个数据库。 |
SQLALCHEMY_ECHO |
如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。 |
SQLALCHEMY_RECORD_QUERIES |
可以用于显式地禁用或者启用查询记录。查询记录 在调试或者测试模式下自动启用。更多信息请参阅 get_debug_queries() 。 |
SQLALCHEMY_NATIVE_UNICODE |
可以用于显式地禁用支持原生的 unicode。这是 某些数据库适配器必须的(像在 Ubuntu 某些版本上的 PostgreSQL),当使用不合适的指定无编码的数据库 默认值时。 |
SQLALCHEMY_POOL_SIZE |
数据库连接池的大小。默认是数据库引擎的默认值 (通常是 5)。 |
SQLALCHEMY_POOL_TIMEOUT |
指定数据库连接池的超时时间。默认是 10。 |
SQLALCHEMY_POOL_RECYCLE |
自动回收连接的秒数。这对 MySQL 是必须的,默认 情况下 MySQL 会自动移除闲置 8 小时或者以上的连接。 需要注意地是如果使用 MySQL 的话, Flask-SQLAlchemy 会自动地设置这个值为 2 小时。 |
SQLALCHEMY_MAX_OVERFLOW |
控制在连接池达到最大值后可以创建的连接数。当这些额外的 连接回收到连接池后将会被断开和抛弃。 |
SQLALCHEMY_TRACK_MODIFICATIONS |
如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。 |
数据库连接池可以避免服务器资源的浪费,这需要视主机的性能自行配置。SQLALCHEMY_ENGINE_OPTIONS可配置的参数即时SQLAlchemy调用create_engine()所需参数,
注册配置时可以根据 flask_env 来判断是开发环境还是生产环境,从而选择不同的配置。
def register_config(app):
"""
根据FLASK_ENV加载配置
"""
flask_env = app.config.get('ENV')
app.config.from_object(f"app.config.{flask_env}.{flask_env.capitalize()}Config")
此时如果有一些机要配置,或是每个开发人员独有的配置,则可以用 .env
文件去配置,如数据库的 URI 或项目密钥等。.env
文件的配置方式上一节中已经介绍过了,配置完后需要将其加入 .gitignore
。
不过用户也可以通过自身环境变量的方式进行配置,Pycharm 则可在启动项中配置环境变量,生产环境则写在 docker 启动时加入环境变量即可。
# .env
SECRET_KEY=G2PAe1n9cardCUXBV20kCd2OV18whSdl
SQLALCHEMY_DATABASE_URI=mysql+cymysql://root:666666@127.0.0.1:3306/tea?charset=utf8mb4