Flask 多个实例的烧瓶配置。最佳实践?

Flask 多个实例的烧瓶配置。最佳实践?,flask,configuration,Flask,Configuration,在flask中,配置模块非常直截了当,在互联网上有大量关于同一主题的最佳实践 如果我必须开发一个支持多个实例的应用程序,例如,假设应用程序支持的每个城市都有一个数据库,每个城市数据库都是独立的MongoDB实例,托管在不同的物理机器上 支持我的示例的示例API代码: from flask import Flask, request from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) clas

在flask中,配置模块非常直截了当,在互联网上有大量关于同一主题的最佳实践

如果我必须开发一个支持多个实例的应用程序,例如,假设应用程序支持的每个城市都有一个数据库,每个城市数据库都是独立的MongoDB实例,托管在不同的物理机器上

支持我的示例的示例API代码:

from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class CityPopulation(Resource):
    def get(self, city_name):
        '''
        CODE TO GET CITY BASED DB Config
        Currently in JSON format
        '''
        total_population = helper_city(city_name)
        return { population : total_population }


api.add_resource(CityPopulation, '/<string:city_name>/population')

if __name__ == '__main__':
    app.run(debug=True)
以及从JSON读取配置的类

class project_config:
    def __init__(self):
        with open(config_full_path, 'r') as myfile:
            configuration_raw = json.load(myfile)
在Flask中,配置模块最佳实践建议如下

class BaseConfig(object):
    DEBUG = False
    TESTING = False

class DevelopmentConfig(BaseConfig):
    DEBUG = True
    TESTING = True

class TestingConfig(BaseConfig):
    DEBUG = False
    TESTING = True

有没有一种方法可以让我的场景包含在flask配置中,而不维护单独的项目配置?就最佳实践而言。

中基于对象的配置被描述为“一种有趣的模式”,但它只是一种方法,不一定是最佳实践

您可以以任何对您的用例有意义的方式更新
app.config
的内容。您可以在运行时从诸如etcd、zookeeper或Concur之类的服务获取值,或者通过环境变量(容器化应用程序的有用模式)设置它们,或者像这样从配置文件加载它们

导入操作系统
导入json
从烧瓶进口烧瓶
从ConfigParser导入ConfigParser
app=烧瓶(名称)
def load_config():
config=ConfigParser()
read(os.environ.get('MY\u APP\u config\u FILE'))
对于config.items('my_app')中的k、v:
app.config[k]=v
@应用程序路径(“/”)
def get_config():
返回json.dumps(dict(app.config),默认值=str)
加载配置()
然后像这样运行它:

$ cat test.ini 
[my_app]
thing = stuff
other_thing = junk

$ MY_APP_CONFIG_FILE=test.ini FLASK_APP=test.py flask run

$ curl -s localhost:5000 | jq '.'
{
  "JSON_AS_ASCII": true,
  "USE_X_SENDFILE": false,
  "SESSION_COOKIE_SECURE": false,
  "SESSION_COOKIE_PATH": null,
  "SESSION_COOKIE_DOMAIN": null,
  "SESSION_COOKIE_NAME": "session",
  "LOGGER_HANDLER_POLICY": "always",
  "LOGGER_NAME": "test",
  "DEBUG": false,
  "SECRET_KEY": null,
  "EXPLAIN_TEMPLATE_LOADING": false,
  "MAX_CONTENT_LENGTH": null,
  "APPLICATION_ROOT": null,
  "SERVER_NAME": null,
  "PREFERRED_URL_SCHEME": "http",
  "JSONIFY_PRETTYPRINT_REGULAR": true,
  "TESTING": false,
  "PERMANENT_SESSION_LIFETIME": "31 days, 0:00:00",
  "PROPAGATE_EXCEPTIONS": null,
  "TEMPLATES_AUTO_RELOAD": null,
  "TRAP_BAD_REQUEST_ERRORS": false,
  "thing": "stuff",                         <---
  "JSON_SORT_KEYS": true,
  "JSONIFY_MIMETYPE": "application/json",
  "SESSION_COOKIE_HTTPONLY": true,
  "SEND_FILE_MAX_AGE_DEFAULT": "12:00:00",
  "PRESERVE_CONTEXT_ON_EXCEPTION": null,
  "other_thing": "junk",                    <---
  "SESSION_REFRESH_EACH_REQUEST": true,
  "TRAP_HTTP_EXCEPTIONS": false
}
$cat test.ini
[我的应用程序]
东西
其他东西=垃圾
$MY\u APP\u CONFIG\u FILE=test.ini FLASK\u APP=test.py FLASK run
$curl-s localhost:5000 | jq''
{
“JSON_AS_ASCII”:真,
“USE_X_SENDFILE”:false,
“会话安全”:false,
“会话路径”:空,
“会话\u COOKIE\u域”:空,
“会话名称”:“会话”,
“记录器处理程序策略”:“始终”,
“记录器名称”:“测试”,
“调试”:错误,
“密钥”:空,
“解释模板加载”:false,
“最大内容长度”:空,
“应用程序根”:空,
“服务器名称”:空,
“首选URL方案”:“http”,
“JSONIFY_PRETTYPRINT_REGULAR”:正确,
“测试”:错误,
“永久会话生命周期”:“31天,0:00:00”,
“传播_异常”:null,
“模板自动重新加载”:空,
“陷阱错误请求错误”:false,

“thing”:“stuff”,我的观点是,如果我们有一个2/3级别的对象树配置,比如“thing”:{}或“thing”:[{},{}],这仍然是保存单个大配置文件的最佳方法吗?
$ cat test.ini 
[my_app]
thing = stuff
other_thing = junk

$ MY_APP_CONFIG_FILE=test.ini FLASK_APP=test.py flask run

$ curl -s localhost:5000 | jq '.'
{
  "JSON_AS_ASCII": true,
  "USE_X_SENDFILE": false,
  "SESSION_COOKIE_SECURE": false,
  "SESSION_COOKIE_PATH": null,
  "SESSION_COOKIE_DOMAIN": null,
  "SESSION_COOKIE_NAME": "session",
  "LOGGER_HANDLER_POLICY": "always",
  "LOGGER_NAME": "test",
  "DEBUG": false,
  "SECRET_KEY": null,
  "EXPLAIN_TEMPLATE_LOADING": false,
  "MAX_CONTENT_LENGTH": null,
  "APPLICATION_ROOT": null,
  "SERVER_NAME": null,
  "PREFERRED_URL_SCHEME": "http",
  "JSONIFY_PRETTYPRINT_REGULAR": true,
  "TESTING": false,
  "PERMANENT_SESSION_LIFETIME": "31 days, 0:00:00",
  "PROPAGATE_EXCEPTIONS": null,
  "TEMPLATES_AUTO_RELOAD": null,
  "TRAP_BAD_REQUEST_ERRORS": false,
  "thing": "stuff",                         <---
  "JSON_SORT_KEYS": true,
  "JSONIFY_MIMETYPE": "application/json",
  "SESSION_COOKIE_HTTPONLY": true,
  "SEND_FILE_MAX_AGE_DEFAULT": "12:00:00",
  "PRESERVE_CONTEXT_ON_EXCEPTION": null,
  "other_thing": "junk",                    <---
  "SESSION_REFRESH_EACH_REQUEST": true,
  "TRAP_HTTP_EXCEPTIONS": false
}