在create_app()

时间:2017-02-26 23:31:10

标签: python flask request

希望根据它是在HTTP还是HTTPS上运行来配置Flask应用程序。

以下代码将引发RuntimeError。

如何动态配置Flask?

每次部署时,进入并手动更改不同的设置会有点痛苦。自动解决方案首选看起来很奇怪Flask没有机制知道它运行之前运行的是哪台机器。也许flask.request是错误的方式。

我看了this documentationthis 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)

1 个答案:

答案 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文件。这是   可扩展到任意数量的开发人员,并且不需要使用   环境变量,可能使测试,开发和   部署。