Nginx 部署Flask应用程序时是否应将instance/config.py上载到生产服务器?
我正在准备部署一个小型的Flask应用程序,我已经为内部使用而开发。我有一台装有Ubuntu服务器16.04、uWSGI和Nginx的旧笔记本电脑,我将使用它进行部署 选项1 我当前的应用程序设置有一个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
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*执行,但这是不可能的