instance/config.py 在部署 Flask 应用时应该上传到生产服务器吗?
Should instance/config.py be uploaded to the production server when deploying a Flask app?
我正准备部署我开发供内部使用的小型 Flask 应用程序。我有一台带有 Ubuntu Server 16.04、uWSGI 和 Nginx 的旧笔记本电脑,我将使用它们进行部署。
选项 1
我当前的应用程序设置有一个 instance/config.py
文件,我已将其 排除在 版本控制之外。此文件包含以下内容:
SECRET_KEY = ...
SQLALCHEMY_DATABASE_URI = ...
# Google 'client_id' and 'client_secret' for social authentication functionality.
instance/config.py
文件在app/__init__.py
中加载如下:
def create_app(config_name):
app = Flask(__name__, instance_relative_config=true)
app.config.from_object(app_config[config_name])
app.config.from_pyfile('config.py')
为生产保留相同的设置并因此在生产服务器中拥有 instance/config.py
文件是否安全?
选项 2
或者,我应该使用环境变量吗?如果是这样的话,我应该在 wsgi.py
:
中做这样的事情吗?
os.environ['FLASK_CONFIG'] = 'production'
os.environ['SECRET_KEY'] = ...
os.environ['SQL_ALCHEMY_DATABASE_URI'] = ...
然后在 app/__init__.py
中有以下内容:
def create_app(config_name):
if os.getenv('FLASK_CONFIG') == 'production':
app = Flask(__name__)
app.config.update(
SECRET_KEY=os.getenv('SECRET_KEY')
SQLALCHEMY_DATABASE_URI=os.getenv('SQLALCHEMY_DATABASE_URI')
)
else:
app = Flask(__name__, instance_relative_config=true)
app.config.from_object(app_config[config_name])
app.config.from_pyfile('config.py')
回答这个问题,是的,只要您的服务器是安全的,它就是安全的。希望只允许使用私钥访问。如果您使用密码登录,那可能是个问题。
将用于加载配置的实际文件置于版本控制之外是个好主意。我实际上在我的一台服务器上犯了一个错误,我在其中将 config.py
放入了版本控制中,现在我每次拉取文件时都必须小心,不要覆盖文件。
你可以做的一件事是为每个环境都有一个配置文件,比如 prod.py
和 dev.py
,它们都已签入。然后创建一个 pointer.py
未签入版本控制。
prod.py
SECRET_KEY = ...
SQLALCHEMY_DATABASE_URI = ...
...
pointer.py
from prod import SECRET_KEY, SQLALCHEMY_DATABASE_URI, ...
server.py
app.config.from_pyfile('pointer.py')
在 dev 中,只需将 import 语句更改为指向 dev.py
。您也可以 from prod import *
,但是 isn't very good practice.
我正准备部署我开发供内部使用的小型 Flask 应用程序。我有一台带有 Ubuntu Server 16.04、uWSGI 和 Nginx 的旧笔记本电脑,我将使用它们进行部署。
选项 1
我当前的应用程序设置有一个 instance/config.py
文件,我已将其 排除在 版本控制之外。此文件包含以下内容:
SECRET_KEY = ...
SQLALCHEMY_DATABASE_URI = ...
# Google 'client_id' and 'client_secret' for social authentication functionality.
instance/config.py
文件在app/__init__.py
中加载如下:
def create_app(config_name):
app = Flask(__name__, instance_relative_config=true)
app.config.from_object(app_config[config_name])
app.config.from_pyfile('config.py')
为生产保留相同的设置并因此在生产服务器中拥有 instance/config.py
文件是否安全?
选项 2
或者,我应该使用环境变量吗?如果是这样的话,我应该在 wsgi.py
:
os.environ['FLASK_CONFIG'] = 'production'
os.environ['SECRET_KEY'] = ...
os.environ['SQL_ALCHEMY_DATABASE_URI'] = ...
然后在 app/__init__.py
中有以下内容:
def create_app(config_name):
if os.getenv('FLASK_CONFIG') == 'production':
app = Flask(__name__)
app.config.update(
SECRET_KEY=os.getenv('SECRET_KEY')
SQLALCHEMY_DATABASE_URI=os.getenv('SQLALCHEMY_DATABASE_URI')
)
else:
app = Flask(__name__, instance_relative_config=true)
app.config.from_object(app_config[config_name])
app.config.from_pyfile('config.py')
回答这个问题,是的,只要您的服务器是安全的,它就是安全的。希望只允许使用私钥访问。如果您使用密码登录,那可能是个问题。
将用于加载配置的实际文件置于版本控制之外是个好主意。我实际上在我的一台服务器上犯了一个错误,我在其中将 config.py
放入了版本控制中,现在我每次拉取文件时都必须小心,不要覆盖文件。
你可以做的一件事是为每个环境都有一个配置文件,比如 prod.py
和 dev.py
,它们都已签入。然后创建一个 pointer.py
未签入版本控制。
prod.py
SECRET_KEY = ...
SQLALCHEMY_DATABASE_URI = ...
...
pointer.py
from prod import SECRET_KEY, SQLALCHEMY_DATABASE_URI, ...
server.py
app.config.from_pyfile('pointer.py')
在 dev 中,只需将 import 语句更改为指向 dev.py
。您也可以 from prod import *
,但是 isn't very good practice.