V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
codists
V2EX  ›  Python

提问: config.ini 文件里面如何配置 json 格式的数据?

  •  
  •   codists ·
    codists · 276 天前 · 2321 次点击
    这是一个创建于 276 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一、说明

    Flask 项目使用的配置文件是 config.ini ,示例:

    [flask]
    FLASK_APP=run.py
    FLASK_ENV=produce
    FLASK_PORT=8000
    SECRET_KEY=''
    
    [local]
    DEBUG=1
    DATABASE_URL=mysql://root:[email protected]:3306/database_local
    SQLALCHEMY_POOL_RECYCLE=3600
    
    [test]
    DEBUG=1
    DATABASE_URL=mysql://root:[email protected]:3306/database_test
    SQLALCHEMY_POOL_RECYCLE=3600
    
    [produce]
    DEBUG=0
    DATABASE_URL=mysql://root:[email protected]:3306/database_produce
    SQLALCHEMY_POOL_RECYCLE=600
    

    二、问题描述

    flask-sqlalchemy 3.1 版本 SQLALCHEMY_POOL_RECYCLE 配置被移除了,变成如下方式:

    SQLALCHEMY_ENGINE_OPTIONS = {
        "pool_recycle": 600,
    }
    

    目前的解决方式是写在读取配置文件的类里面:

    import configparser
    import os
    
    cf = configparser.ConfigParser()
    config_dir = os.path.dirname(os.path.abspath(__file__))
    
    cf.read(os.path.join(config_dir, "config.ini"))
    
    
    class Config:
    
        # Flask
        FLASK_ENV = cf.get("flask", "FLASK_ENV")
        SECRET_KEY = cf.get("flask", "SECRET_KEY")
        FLASK_PORT = cf.getint("flask", "FLASK_PORT")
        DEBUG = True if cf.getint(FLASK_ENV, "DEBUG") else False
    
        # SQLALCHEMY
        SQLALCHEMY_DATABASE_URI = cf.get(FLASK_ENV, "DATABASE_URL")
        SQLALCHEMY_ENGINE_OPTIONS = {
            "pool_recycle": 600
        } # 这样就无法区分 local 、test 、produce 环境
    

    但是,这样写会导致一个问题——local 、test 、produce 三个环境都使用了相同的 pool_recycle ,不满足需求。请问在 config.ini 里面如何根据不同的环境配置不同的 SQLALCHEMY_ENGINE_OPTIONS(或 pool_recycle)?

    请各位大佬指点指点,谢谢。

    9 条回复    2024-02-19 10:30:52 +08:00
    nulIptr
        1
    nulIptr  
       276 天前   ❤️ 1
    如果是我的话可能会把配置文件整个都改成 json 或者 yaml
    想改动小的话不改配置文件,读文件的时候做个映射不得了
    比如
    SQLALCHEMY_ENGINE_OPTIONS = {
    "pool_recycle": cf.getint(FLASK_ENV, "SQLALCHEMY_POOL_RECYCLE")
    }
    linauror
        2
    linauror  
       276 天前   ❤️ 1
    按 1 的配置写法,这样直接去取不行吗?把代码中的 600 直接替换为 cf.get(FLASK_ENV, "SQLALCHEMY_POOL_RECYCLE")
    codists
        3
    codists  
    OP
       276 天前
    codists
        4
    codists  
    OP
       276 天前
    感谢两位大佬的解答。
    lisongeee
        5
    lisongeee  
       276 天前   ❤️ 1
    能不能将 ini 后缀改成 toml, 然后使用 tomlkit 模块读取

    然后只需要把 SQLALCHEMY_ENGINE_OPTIONS={"pool_recycle": 600,} 正常放在 SQLALCHEMY_POOL_RECYCLE=3600 的下面一行就行
    lisongeee
        6
    lisongeee  
       276 天前
    好像还得把原来的字符串类型如 produce 和 mysql://root 加上引号才行
    LeeYD
        7
    LeeYD  
       275 天前 via Android   ❤️ 1
    config.py
    ```python
    import os

    class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY', '')
    SQLALCHEMY_ENGINE_OPTIONS = {
    "pool_recycle": 600
    }

    class LocalConfig(Config):
    DEBUG = True
    DATABASE_URL = 'mysql://root:[email protected]:3306/database_local'
    SQLALCHEMY_POOL_RECYCLE = 3600

    class TestConfig(Config):
    DEBUG = True
    DATABASE_URL = 'mysql://root:[email protected]:3306/database_test'
    SQLALCHEMY_POOL_RECYCLE = 3600

    class ProductionConfig(Config):
    DEBUG = False
    DATABASE_URL = 'mysql://root:[email protected]:3306/database_produce'
    SQLALCHEMY_POOL_RECYCLE = 600
    ```

    run.py
    ```python
    from flask import Flask
    from config import LocalConfig, TestConfig, ProductionConfig

    app = Flask(__name__)

    env = 'production'

    if env == 'local':
    app.config.from_object(LocalConfig)
    elif env == 'test':
    app.config.from_object(TestConfig)
    elif env == 'production':
    app.config.from_object(ProductionConfig)

    ```
    codists
        8
    codists  
    OP
       275 天前
    @lisongeee 感谢大佬的解答,toml 确实支持 json(table)的配置。
    codists
        9
    codists  
    OP
       275 天前
    @LeeYD 感谢大佬的解答,这里主要是讨论配置文件(如.env, .ini, yaml, json, toml 等文件)对 json 的支持。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3176 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:17 · PVG 21:17 · LAX 05:17 · JFK 08:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.