如何使用配置文件部署flask应用程序?



我有一个flask应用程序,我使用一个带有一些敏感信息的配置文件。我想知道如何使用配置文件部署我的应用程序,而不释放它持有的敏感信息。

;创建一个类来保存你的配置秘密,将实际的秘密存储在主机上的环境变量中,并在你的应用程序中读取环境变量。

详细实现如下。

这是我的文件夹结构:
api
|_cofig
|_config.py
|_app.py

然后在实际启动我的Flask应用程序的app.py中,它看起来大致如下(我已经排除了所有无关紧要的内容):

from config.config import config
def create_app(app_environment=None):
if app_environment is None:
app = Flask(__name__)
app.config.from_object(config[os.getenv('FLASK_ENV', 'dev')])
else:
app = Flask(__name__)
app.config.from_object(config[app_environment])
if __name__ == "__main__":
app = create_app(os.getenv('FLASK_ENV', 'dev'))
app.run()

允许你动态指定一个应用环境。例如,您可以通过设置环境变量并在调用create_app()之前将其读入来传递应用程序环境。如果你使用Docker或其他虚拟化工具来容器化你的Flask应用,这是非常有用的。

最后,我的config.py文件看起来像这样。您可以将我的每个环境配置中的属性更改为您的秘密。

import os
class ProdConfig:
# Database configuration
API_TOKEN = os.environ.get('PROD_MARKET_STACK_API_KEY_SECRET')

class DevConfig:
# Database configuration
API_TOKEN = os.environ.get('API_KEY_SECRET')
class TestConfig:
# Database configuration
API_TOKEN = os.environ.get('MARKET_STACK_API_KEY')
config = {
'dev': DevConfig,
'test': TestConfig,
'prod': ProdConfig
}

此外,你可以通过…在你的Flask应用程序的任何模块中访问你的配置秘密。

from flask import current_app
current_app.config['API_TOKEN']`

我相信你的问题的答案可能与你的应用程序部署在哪里有关,而不是你使用哪个web框架。

据我所知,在源文件上存储/跟踪敏感信息(例如密码和API密钥)是一种不好的做法,您应该避免这样做。

如果你已经提交了敏感数据,并且你想从你的git历史记录中完全删除它,我建议你检查这个GitHub页面。

一些高级的解决方案可以是:

  1. 是否配置文件访问环境变量而不是硬编码值
  2. 如果你正在使用云服务,如谷歌云平台或AWS,你可以使用一个秘密管理器来存储你的数据,并从你的应用程序安全地获取它。
  3. 另一种方法是加密存储信息(可能使用KMS之类的东西),并在需要时解密(我最不喜欢的)。

我已经在azure上部署了flask web应用程序api。我有很多配置文件,我已经创建了一个单独的目录,我保持我所有的配置文件。这就是我的项目目录

的样子
configs
-> app_config.json
-> client_config.json
logs
-> app_debug.log
-> app_error.log
data
-> some other data related files
app.py

app.py是我的主要python文件,我从其中导入了所有配置文件,下面是我如何使用它

config_file = os.path.join(os.path.dirname(__file__), 'configs', 'app_config.json')
# Get the config data from config json file
json_data = open(config_file)
config_data = json.load(json_data)
json_data.close()

之后,我可以很容易地使用config_data在代码的任何地方:

mongo_db = connect_mongodb(username=config_data['MongoUsername'], password=config_data['MongoPassword'], url=config_data['MongoDBURL'], port=config_data['Port'], authdbname=config_data['AuthDBName'])

最新更新