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

Nginx 部署Flask应用程序时是否应将instance/config.py上载到生产服务器?,nginx,flask,uwsgi,Nginx,Flask,Uwsgi,我正在准备部署一个小型的Flask应用程序,我已经为内部使用而开发。我有一台装有Ubuntu服务器16.04、uWSGI和Nginx的旧笔记本电脑,我将使用它进行部署 选项1 我当前的应用程序设置有一个instance/config.py文件,我将该文件保留在版本控制之外。此文件包含以下内容: SECRET_KEY = ... SQLALCHEMY_DATABASE_URI = ... # Google 'client_id' and 'client_secret' for social au

我正在准备部署一个小型的Flask应用程序,我已经为内部使用而开发。我有一台装有Ubuntu服务器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/\uuuu init\uuuu.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')
os.environ['FLASK_CONFIG'] = 'production'
os.environ['SECRET_KEY'] = ...
os.environ['SQL_ALCHEMY_DATABASE_URI'] = ...
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
文件?

选项2

或者,我应该使用环境变量吗?如果是这种情况,我是否应该在
wsgi.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')
os.environ['FLASK_CONFIG'] = 'production'
os.environ['SECRET_KEY'] = ...
os.environ['SQL_ALCHEMY_DATABASE_URI'] = ...
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')
然后在
app/\uuuuu init\uuuuuuuy.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')
os.environ['FLASK_CONFIG'] = 'production'
os.environ['SECRET_KEY'] = ...
os.environ['SQL_ALCHEMY_DATABASE_URI'] = ...
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
,这两个环境都已签入。然后创建一个未签入版本控制的
指针.py

prod.py

SECRET_KEY = ...
SQLALCHEMY_DATABASE_URI = ...
...
from prod import SECRET_KEY, SQLALCHEMY_DATABASE_URI, ...
app.config.from_pyfile('pointer.py')
pointer.py

SECRET_KEY = ...
SQLALCHEMY_DATABASE_URI = ...
...
from prod import SECRET_KEY, SQLALCHEMY_DATABASE_URI, ...
app.config.from_pyfile('pointer.py')
server.py

SECRET_KEY = ...
SQLALCHEMY_DATABASE_URI = ...
...
from prod import SECRET_KEY, SQLALCHEMY_DATABASE_URI, ...
app.config.from_pyfile('pointer.py')
在dev中,只需将import语句更改为指向
dev.py
。您也可以从prod import*执行
,但这是不可能的