gpt4 book ai didi

python - 为什么 Flask 不从配置类配置某些环境变量?需要帮助理解配置过程

转载 作者:行者123 更新时间:2023-12-01 06:30:17 24 4
gpt4 key购买 nike

我的应用程序似乎完全能够基于.env进行配置文件,导入的配置类,并直接定义变量。然而,FLASK_DEBUG无法根据我定义变量的方式进行更改。

我可能应该注意到,我在 Windows 上使用 Visual Studio Code。有人告诉我,我需要使用 Linux 或除 Windows 之外的任何其他操作系统,我也打算这样做,但现在这不是一个选择,因此,如果能帮助我理解这个功能如何与我所拥有的系统配合使用以及如何导航,我将不胜感激。

配置.py:

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class DevelopmentConfig(object):
os.environ['SECRET_KEY'] = b'something'
os.environ['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'app.db')
os.environ['SQLALCHEMY_TRACK_MODIFICATIONS'] = 'False'
os.environ['FLASK_DEBUG'] = '1'
os.environ['DEV_DICT'] = 'dev_config_class_environ_dictionary_activated_and_working'

class ProductionConfig(object):
os.environ['SECRET_KEY'] = os.environ.get('SECRET_KEY')
os.environ['SQLALCHEMY_DATABASE_URI'] = os.environ.get('PRODUCTION_DATABASE_URI')
os.environ['SQLALCHEMY_TRACK_MODIFICATION'] = 'False'
os.environ['FLASK_DEBUG'] = '0'
os.environ['PROD_DICT'] = 'prod_config_class_environ_dictionary_activated_and_working'

init.py:

from flask import Flask
from config import DevelopmentConfig, ProductionConfig
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from dotenv import load_dotenv, find_dotenv
import os

app = Flask(__name__)
db = SQLAlchemy(app)
migrate = Migrate(app, db)

load_dotenv(find_dotenv())

if os.environ.get('FLASK_ENV') == 'development':
print("Environment is development")
app.config.from_object(DevelopmentConfig)
elif os.environ.get('FLASK_ENV') == 'production':
print("Environment is production")
app.config.from_object(ProductionConfig)

print(os.environ.get('TEST_DOTENV')) #This value is stored in .env
print(os.environ.get('DEV_DICT')) #defined in class DevelopmentConfig as os.environ['DEV_DIVT']
print(os.environ.get('PROD_DICT')) #same but in the ProductionConfig class
print(os.environ.get('FLASK_ENV')) #defined differently in both classes and CONFIGS CORRECTLY
print(os.environ.get('FLASK_DEBUG')) #defined differently in both classes and DOES NOT CONFIG CORRECTLY

.env:

FLASK_ENV=development
FLASK_APP=run.py
SECRET_KEY=b'something'
PRODUCTION_DATABASE_URI='something_else'
TEST_DOTENV=config_from_dotenv_is_working #prints correctly to command line, as do other variables defined here

当我运行应用程序时:

(flaskvenv) PS C:\Users\peter\Desktop\Projects\Social Work Site\sw_app> flask run
* Serving Flask app "run.py" (lazy loading)
* Environment: development
* Debug mode: on
* Restarting with stat
c:\...__init__.py:814: UserWarning: Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".
'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. '
c:\...__init__.py:835: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead...

Environment is development #changes correctly if I change it in .env
config_from_dotenv_is_working #further proof .env works fine
dev_config_class_environ_dictionary_activated_and_working #prints regardless of which class gets called
prod_config_class_environ_dictionary_activated_and_working #also prints regardless of which class gets called
development #changes to production properly if I change it in .env
0 #stubbornly stays set to 0 regardless of it being set in config

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

这是奇怪的部分:

当我定义FLASK_DEBUG时在 .env文件,命令行在自动输出中正确显示它,例如如* Debug mode: off* Debug mode: on取决于我是否将其设置为 01分别。

但是当我用 os.environ.get('FLASK_DEBUG') 调用它时,无论我做什么,它都显示为 0。

基于此,我有几个问题。

问题的主要和本质当然是:

  1. 为什么 Flask 没有配置 FLASK_DEBUG但其他变量配置正常?

我怀疑可能存在某种联系并有助于我理解这一点的其他问题:

  • Windows 操作系统在这个问题中扮演什么角色?
  • 如果我只调用其中一个配置类,为什么两个配置类都要配置环境变量?
  • 为什么如果自动输出告诉我 Debug modeon确实os.environ.get('FLASK_DEBUG')仍然返回0
  • 我可以通过定义 FLASK_ENV 来解决这个问题在.env ,但我想了解它是如何工作的。事物配置方式的差异让我感到不安,因为我不知道事物如何或为何以它们的方式运行。

    提前致谢!

    最佳答案

    您混淆了配置类和环境变量的概念。

    结果说明

    如果您定义两个类并立即在这些定义中设置环境变量,那么它们都将立即运行。不要这样做:

    # config.py
    import os

    class DevelopmentConfig(object):
    os.environ['FLASK_DEBUG'] = '1'

    class ProductionConfig(object):
    os.environ['FLASK_DEBUG'] = '0'

    print('FLASK_DEBUG is', os.environ['FLASK_DEBUG'])

    运行此代码后,两个类都将设置环境。变量,由于 0 是最后设置的值,因此结果将为 0:

    $ python config.py
    FLASK_DEBUG is 0

    这就是您的 FLASK_DEBUG 始终为 0 的原因。无论设置什么,DevelopmentConfigProductionConfig 内的所有代码都会运行在您的 .env 文件中。您的问题与 Windows 无关。

    除了类之外,您还可以从 .env 文件设置环境变量,包括 FLASK_ENV=development。这是 Flask 识别的变量,它将打开 Debug模式。这就是 Flask 中打开 Debug模式的原因。

    一种解决方案:使用特定于环境的配置类

    在类中定义值:

    class DevelopmentConfig(object):
    MY_VARIABLE = 'dev value'
    ...

    class ProductionConfig(object):
    MY_VARIABLE = 'prod value'
    ...

    然后在环境变量中设置环境。这可以直接在操作系统中完成,或者如果您愿意,也可以使用 .env 文件:

    FLASK_ENV=development

    在生产服务器上,您将创建一个不同的 .env 文件:

    FLASK_ENV=production

    然后在Flask中加载相关类:

    from dotenv import load_dotenv, find_dotenv
    from flask import Flask
    import os

    load_dotenv(find_dotenv())
    app = Flask(__name__)
    config = ProductionConfig() if os.environ.get('FLASK_ENV') == 'production' else DevelopmentConfig()
    app.config.from_object(config)
    print(app.config['MY_VARIABLE'])

    在这种情况下,您甚至不需要设置 FLASK_DEBUG,因为 Flask 会根据 FLASK_ENV 自动设置它。

    其他解决方案

    您还可以完全放弃配置类,而是从环境变量或配置文件中导入所有值。阅读Flask config guide更多细节。

    关于python - 为什么 Flask 不从配置类配置某些环境变量?需要帮助理解配置过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59943414/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com