如何在配置文件中设置FLASK_ENV?

时间:2019-02-08 21:24:11

标签: python flask

TL; DR

我不想每次登录时export变量。我希望它们在我的配置中。

来自文档

  

建议使用如上所述的环境变量。虽然可以在配置或代码中设置ENV和DEBUG,但强烈建议不要这样做。

我该怎么办?怎么可能?

更多-我尝试过的事情

我有一个flask.cfg和一个FLASK_ENV='development'。我运行flask run,并打印出development。但是生产服务器已经启动。 terminal它忽略以下内容:

app.config.from_pyfile("flask.cfg")

print(f"{app.config['ENV']}") => development

这是一个无关紧要的个人项目。因此,为了方便起见,我忽略了最佳做法。

6 个答案:

答案 0 :(得分:3)

2020年3月更新:

根据Flask devs,您不能再这样做:

ENV和DEBUG配置值很特殊,因为它们可能会表现 在应用程序开始设置后,如果更改不一致,则不一致。为了 为了可靠地设置环境和调试模式,Flask使用环境 变量。

该环境用于指示Flask,扩展名和其他 程序(例如Sentry)在Flask中运行的上下文。它是 由FLASK_ENV环境变量控制,默认为 生产。

将FLASK_ENV设置为开发将启用调试模式。烧瓶运行 默认将在调试中使用交互式调试器和重新加载器 模式。要与环境分开控制,请使用 FLASK_DEBUG标志。

将Flask切换到开发环境并启用 调试模式,设置FLASK_ENV:

> $ export FLASK_ENV=development 
> $ flask run (On Windows, use set instead of export.)

建议使用如上所述的环境变量。 虽然可以在配置或代码中设置ENV和DEBUG,但这 强烈建议不要这样做。烧瓶无法尽早读取它们 命令,并且某些系统或扩展名可能已经配置 本身基于先前的值。

答案 1 :(得分:2)

这有什么用:安装 python-dotenv 软件包,在项目根文件夹中创建一个.flaskenv文件,然后添加以下内容:

FLASK_APP=app.py (or whatever you named it)
FLASK_ENV=development (or production)

保存。做烧瓶运行

答案 2 :(得分:1)

WINDOWS

我不知道为什么我的修复程序起作用,但是成功了。看起来Powershell只关心一行,因此它会忽略您在“烧瓶运行”之前键入的所有内容 所以我创建了只说

的批处理文件
@echo off
set FLASK_ENV=development
set FLASK_APP=run.py
flask run

它像以前一样工作。

因此在Linux中,您可能需要更改终端或为此创建快捷方式。也许会解决。我不确定,虽然。但是对于Windows来说就可以了

答案 3 :(得分:0)

您的项目结构如下所示:

dad_site /
| -app /
.. |-__init__。py
.. | -flask.cfg
| -run.py

您的应用程序/__init__.py文件:

from flask import Flask

app = Flask(__name__)
app.config.from_pyfile('flask.cfg', silent=True)

@app.route('/')
def home():
    return 'Hello World'

/app/flask.cfg配置文件:

TESTING=False
DEBUG=True

run.py文件:

from app import app

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)

您还可以定义一个实例文件夹,并将您的配置文件放在其中。因此您的应用程序结构如下所示:

dad_site /
| -app /
.. |-__init__。py
.. | -instance /
.... | -flask.cfg
| -run.py

还有您的__init__。py文件:

from flask import Flask
import os

def get_app_base_path():
    return os.path.dirname(os.path.realpath(__file__))


def get_instance_folder_path():
    return os.path.join(get_app_base_path(), 
                        'instance')

app = Flask(__name__,
            instance_path=get_instance_folder_path(),
            instance_relative_config=True)

app.config.from_pyfile('flask.cfg', silent=True)

@app.route('/')
def home():
    return 'Hello World'

答案 4 :(得分:0)

如果将配置移入Python,事情会变得容易一些。考虑

from flask import Flask
from config import Config

app = Flask(__name__)
app.config.from_object(Config)

config.py的外观

import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY', 'default sekret')

这为您提供了可以被环境变量覆盖的默认值。

答案 5 :(得分:0)

尽管可能不建议这样做,但是您可以创建一个custom script并将其设置在那里。

manage.py

#!/usr/bin/env python

from os import path as environ

import click

from flask import Flask
from flask.cli import FlaskGroup

def create_app():
    app = Flask(__name__)
    ...
    return app


@click.group(cls=FlaskGroup, create_app=create_app)
@click.option('-e', '--env', default="development")
def manager(env):
    environ["FLASK_ENV"] = env


if __name__ == "__main__":
    manager()

现在在命令行中(运行pip install manage.py后)可以执行manage runmanage -e production run

app factory pattern结合使用,您还可以动态更改配置。