Flask 多个实例的烧瓶配置。最佳实践?
在flask中,配置模块非常直截了当,在互联网上有大量关于同一主题的最佳实践 如果我必须开发一个支持多个实例的应用程序,例如,假设应用程序支持的每个城市都有一个数据库,每个城市数据库都是独立的MongoDB实例,托管在不同的物理机器上 支持我的示例的示例API代码: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
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
}