Jeffrey的博客 Jeffrey的博客

左脑编程,右脑写诗

目录
Flask构建Web API Wheel(五)—— 多环境配置
/      

Flask构建Web API Wheel(五)—— 多环境配置

曾经在《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

SQLAlchemy配置

对于数据库的配置,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()所需参数,

  • pool_size: 连接池的大小
  • max_overflow: 允许超出连接池多大
  • pool_recycle: DBAPI connection存活多久
  • pool_timeout: 等待连接池中获取新连接的等待时间
  • pool_pre_ping: connection预检测

加载配置

注册配置时可以根据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

标题:Flask构建Web API Wheel(五)—— 多环境配置
作者:Jeffrey