深入浅出Flask:怎么样读取配置参数

Posted caimouse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出Flask:怎么样读取配置参数相关的知识,希望对你有一定的参考价值。

在我们开发软件的过程中,必然会跟配置参数打交道,为什么这样说呢?因为开发的软件都需要发布给客户使用,这样才能实现软件的价值。从而导致开发环境与客户使用环境的差别,这时候就需要使用配置参数,以便区分开发环境与客户的生产环境。因为开发环境都需要输出比较多的信息,比如日志,而日志又会打印比较详细的信息,方便调试和修改错误。而在客户那里时,就不需要输出这么多日志了,因为输出太多日志,总会占用CPU资源,这样导致用户的体验不佳,也就导致了自己的产品与别人的产品竞争不利。说句不好听的话,在今时今日这样的商业环境里,已经是体验为王的时代,如果体验不好,即使满足用户的需求,如果体验不好也会被用户放弃,这样没有了用户就没有了收入,公司就会倒闭。可见软件开发都是一项极其细致的活,也是一项尽善尽美的工作。

在flask里配置参数是一件比较简单的工作,如果一个比较小的项目,可以直接把参数写到程序里就可以解决了,比如下面的例子:

#python 3.7.4, flask 
#蔡军生 https://blog.csdn.net/caimouse
#9073204@qq.com
#

from flask import Flask

app = Flask(__name__)
# 直接赋值
app.config['SECRET_KEY'] = 'some secret words'
app.config['DEBUG'] = True
app.config['ITEMS_PER_PAGE'] = 10
# 或者更新字典的方式
app.config.update(
    DEBUG=True,
    SECRET_KEY='some secret words',
    ITEMS_PER_PAGE=10
)

print(app.config)

结果输出如下:

<Config {'ENV': 'production', 'DEBUG': True, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': 'some secret words', 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(seconds=43200), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, 'ITEMS_PER_PAGE': 10}>
>>> 

但是项目比较大的时候,就需要把配置信息单独写到配置文件里,这样方便修改,也方便使用不同的文件来选择参数。这时候要使用app.config.from_object函数或app.config.from_pyfile('config.py')来加载配置信息。

比如下面的例子,先把配置信息写到config.py文件里:

class Config(object):

    DEBUG = False

    TESTING = False

    DATABASE_URI = 'sqlite://:memory:'

class ProductionConfig(Config):

    DATABASE_URI = 'mysql://user@localhost/foo'

class DevelopmentConfig(Config):

    DEBUG = True

class TestingConfig(Config):

    TESTING = True

然后编写代码来读取配置信息:

#python 3.7.4, flask 
#蔡军生 https://blog.csdn.net/caimouse
#9073204@qq.com
#

from flask import Flask

app = Flask(__name__)

app.config.from_object('config.ProductionConfig')

print(app.config)

结果输出如下:

<Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(seconds=43200), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, 'DATABASE_URI': 'mysql://user@localhost/foo'}>

可以看到通过继承的方式来修改配置文件信息。

接着下来,我们来看一个实际使用中的例子,可能会更加复杂一些,首先创建一个配置目录,如下图:

然后程序读取文件在目录sample,如下图:

这样就可以把不同的配置文件放到目录configs里,方便保存不同的配置参数文件,也方便以后部署人员进行管理修改。它会读取目录configs里的文件default.py,它是一个包的管理方式,接着读取到类名称:DefaultConfig。

app.config.from_object("configs.default.DefaultConfig")

这个例子的代码如下:

#python 3.7.4, flask 
#蔡军生 https://blog.csdn.net/caimouse
#9073204@qq.com
#
import logging
import logging.config

from flask import Flask, request

logger = logging.getLogger(__name__)

def create_app(config=None, instance_path=None):
    app = Flask(
        "flaskRDMS", instance_path=instance_path, instance_relative_config=True
    )

    app.config.from_object("configs.default.DefaultConfig")

    print(app.config)

#
create_app()

运行之后输出结果如下:

<Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': 'secret key', 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(seconds=43200), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, 'ADMINS': ['admin@example.org'], 'ADMIN_URL_PREFIX': '/admin', 'ALEMBIC': {'script_location': 'D:\\\\work\\\\Flask\\\\src\\\\flaskbb/migrations', 'version_locations': '', 'file_template': '%%(year)d%%(month).2d%%(day).2d%%(hour).2d%%(minute).2d_%%(rev)s_%%(slug)s'}, 'ALEMBIC_CONTEXT': {'render_as_batch': True}, 'ALLOWED_HOSTS': None, 'AUTH_URL_PREFIX': '/auth', 'CACHE_DEFAULT_TIMEOUT': 60, 'CACHE_TYPE': 'SimpleCache', 'CELERY_CONFIG': {'broker_url': 'redis://localhost:6379', 'result_backend': 'redis://localhost:6379', 'broker_transport_options': {'max_retries': 1}}, 'FORUM_URL_PREFIX': '', 'LOGIN_MESSAGE_CATEGORY': 'info', 'LOGIN_VIEW': 'auth.login', 'LOG_CONF_FILE': None, 'LOG_DEFAULT_CONF': {'version': 1, 'disable_existing_loggers': False, 'formatters': {'standard': {'format': '%(asctime)s %(levelname)-7s %(name)-25s %(message)s'}, 'advanced': {'format': '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'}}, 'handlers': {'console': {'level': 'NOTSET', 'formatter': 'standard', 'class': 'logging.StreamHandler'}, 'flaskbb': {'level': 'DEBUG', 'formatter': 'standard', 'class': 'logging.handlers.RotatingFileHandler', 'filename': 'D:\\\\work\\\\Flask\\\\src\\\\logs\\\\flaskbb.log', 'mode': 'a', 'maxBytes': 10485760, 'backupCount': 5}, 'infolog': {'level': 'INFO', 'formatter': 'standard', 'class': 'logging.handlers.RotatingFileHandler', 'filename': 'D:\\\\work\\\\Flask\\\\src\\\\logs\\\\info.log', 'mode': 'a', 'maxBytes': 10485760, 'backupCount': 5}, 'errorlog': {'level': 'ERROR', 'formatter': 'standard', 'class': 'logging.handlers.RotatingFileHandler', 'filename': 'D:\\\\work\\\\Flask\\\\src\\\\logs\\\\error.log', 'mode': 'a', 'maxBytes': 10485760, 'backupCount': 5}}, 'loggers': {'flask.app': {'handlers': ['infolog', 'errorlog'], 'level': 'INFO', 'propagate': True}, 'flaskbb': {'handlers': ['console', 'flaskbb'], 'level': 'WARNING', 'propagate': True}}}, 'LOG_PATH': 'D:\\\\work\\\\Flask\\\\src\\\\logs', 'MAIL_DEFAULT_SENDER': ('Default Sender', 'noreply@example.org'), 'MAIL_PASSWORD': '', 'MAIL_PORT': 25, 'MAIL_SERVER': 'localhost', 'MAIL_USERNAME': 'noreply@example.org', 'MAIL_USE_SSL': False, 'MAIL_USE_TLS': False, 'MESSAGE_URL_PREFIX': '/message', 'REAUTH_VIEW': 'auth.reauth', 'REDIS_DATABASE': 0, 'REDIS_ENABLED': False, 'REDIS_URL': 'redis://localhost:6379', 'REFRESH_MESSAGE_CATEGORY': 'info', 'REMEMBER_COOKIE_DOMAIN': None, 'REMEMBER_COOKIE_DURATION': datetime.timedelta(days=365), 'REMEMBER_COOKIE_HTTPONLY': False, 'REMEMBER_COOKIE_NAME': 'remember_token', 'REMEMBER_COOKIE_PATH': '/', 'REMEMBER_COOKIE_SECURE': None, 'REMOVE_DEAD_PLUGINS': False, 'SEND_LOGS': False, 'SQLALCHEMY_DATABASE_URI': 'sqlite:///D:\\\\work\\\\Flask\\\\src/flaskbb.sqlite', 'SQLALCHEMY_ECHO': False, 'SQLALCHEMY_TRACK_MODIFICATIONS': False, 'USER_URL_PREFIX': '/user', 'USE_DEFAULT_LOGGING': True, 'WHOOSHEE_DIR': 'D:\\\\work\\\\Flask\\\\src\\\\whoosh_index\\\\37', 'WHOOSHEE_MIN_STRING_LEN': 3, 'WHOOSHEE_WRITER_TIMEOUT': 2, 'WTF_CSRF_ENABLED': True, 'WTF_CSRF_SECRET_KEY': 'reallyhardtoguess'}>
>>> 

通过上面的学习,我们理解了flask的配置参数,这样编写flask项目的第一步要做的工作。

以上是关于深入浅出Flask:怎么样读取配置参数的主要内容,如果未能解决你的问题,请参考以下文章

4. Flask 项目参数配置以及读取

深入浅出Flask(43): Flask应用创建配置参数命令

深入浅出Flask:服务器输出304代表什么

实例化Flask的参数 及 对app的配置

实例化flask的参数及对app的配置

Flask最强攻略 - 跟DragonFire学Flask - 第八篇 实例化Flask的参数 及 对app的配置