希望根据它是在HTTP还是HTTPS上运行来配置Flask应用程序。
以下代码将引发RuntimeError。
如何动态配置Flask?
每次部署时,进入并手动更改不同的设置会有点痛苦。自动解决方案首选看起来很奇怪Flask没有机制知道它运行之前运行的是哪台机器。也许flask.request是错误的方式。
我看了this documentation和this SO post。
from flask import Flask, request
def create_app():
app = Flask(__name__)
app.config['DEBUG'] = not request.is_secure
return app
# Initialize App
app = create_app()
错误详情。
RuntimeError:在请求上下文之外工作。
这通常意味着您尝试使用该功能 需要一个活动的HTTP请求。请参阅测试文档 有关如何避免此问题的信息。
基于flask config docs的另一次尝试。收到相同的RuntimeError。
# Configuration Options
class Config(object):
DEBUG = False
TESTING = False
FLASKS3_BUCKET_NAME = 'nueverest'
FLASKS3_USE_HTTPS = True
USE_S3_DEBUG = False
class Production(Config):
pass
class Development(Config):
DEBUG = True
USE_S3_DEBUG = True
app = Flask(__name__) # Initialize Application
if request.is_secure: # Select Configuration
app.config.from_object(Production)
else:
app.config.from_object(Development)
答案 0 :(得分:0)
丹尼尔罗斯曼解释说,flask.request
不能使用,因为必须先发出请求(鸡肉和鸡蛋)。
解决方案:使用
uuid.getnode()
唯一标识哪台机器 代码正在运行。
为了使其可扩展,每个开发人员必须创建自己的secrets.py文件。该文件不应添加到VCS,因为它对每个开发人员都是唯一的。看起来像这样。
import uuid
def is_production():
""" Determines if app is running on the production server via uuid comparison.
HOW TO USE:
Open a terminal
> python
> import uuid
> uuid.getnode()
12345678987654321 <-- Copy whatever is returned and replace 111111111 with this.
Compare uuid for the machine against the known uuid(s) of your development machine(s).
:return: (bool) True if code is running on the production server, and False otherwise.
"""
developer_machines = [111111111, ]
return uuid.getnode() not in developer_machines
app.py导入secrets.is_production(),看起来像这样。
from flask import Flask
from secrets import is_production
def create_app():
app = Flask(__name__)
app.config['DEBUG'] = not is_production()
return app
# Initialize App
app = create_app()
可伸缩性:每个开发人员都管理自己的secrets.py文件。这是 可扩展到任意数量的开发人员,并且不需要使用 环境变量,可能使测试,开发和 部署。