在部署Flask应用程序时,是否应将instance / config.py上传到生产服务器?

时间:2017-03-14 15:32:59

标签: nginx flask uwsgi

我准备部署一个我开发用于内部使用的小型Flask应用程序。我有一台旧笔记本电脑,带有Ubuntu Server 16.04,uWSGI和Nginx,我将用它进行部署。

选项1

我当前的应用设置有一个instance/config.py文件,我保持 out 版本控制。该文件包含以下内容:

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')

1 个答案:

答案 0 :(得分:0)

要回答这个问题,只要您的服务器安全,它就是安全的。希望只允许使用私钥进行访问。如果您使用密码登录,则可能存在问题。

保持用于加载配置的实际文件超出版本控制是个好主意。我实际上在我的一台服务器上犯了一个错误,我把config.py置于版本控制中,现在每次拉不覆盖文件时我都要小心。

您可以做的一件事是为每个环境设置一个配置文件,比如prod.pydev.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')

在开发中,只需将import语句更改为指向dev.py即可。您也可以执行from prod import *,但isn't very good practice