未使用 FLASK_APP 和 App Factory 加载 Flask 配置

cwo*_*ork 2 python flask

我设置了一个应用程序,尝试使用 .env 文件对其进行配置,使用 python-dotenv 加载它并使用 Config 类来获取变量。如果我设置 FLASK_APP,例如:export FLASK_APP=pg.py,并执行烧瓶运行,应用程序会运行,但未加载配置。我知道环境变量是从我的 .env 文件中加载的,经过大量修改后,我意识到该应用程序是在没有上下文的情况下创建的(我认为),但我不确定如何让它这样做。如果我将 app.run() 添加到 pg.py 的末尾,它会起作用,但我知道这不是我应该做的。我读过这个页面:http : //flask.pocoo.org/docs/0.12/cli/好几次,我不能完全按照它来获得我想要的东西。我尝试 export FLASK_CONFIG=development 作为我的最后一次尝试,看看它是否能正常工作,但它没有。所以我的问题是,我如何使用烧瓶运行,并让它正确运行我的应用程序,而不是运行“python pg.py”

编辑:我注意到一切正常,除了配置。不知道我错过了什么。我觉得,根据我读过的内容, FLASK_CONFIG=development 应该可以工作。这几乎就像是使用“app = Flask( name )”创建的应用程序,跳过配置加载,并转到蓝图注册。为什么?我知道我可以在运行之前导出我所有的敏感信息,并这样做,但现在我一直在试图找出问题,并且在我理解之前无法放手:/

编辑 2:实际上,上下文已正确创建并应用了配置。它只是不从环境中读取。DEBUG=True 不起作用,但其他配置起作用。也许应用程序实例是在环境加载 .env 中的变量之前创建的。我将把它留在这里,当我找到它时更新一个解决方案。

应用程序/__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import config

db = SQLAlchemy()


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    db.init_app(app)

    from app.main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app
Run Code Online (Sandbox Code Playgroud)

配置文件

import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'environment not set'
    SQLALCHEMY_DATABASE_URI = os.environ.get('DB_URI')

    @staticmethod
    def init_app(app):
        pass


class DevelopmentConfig(Config):
    DEBUG = True


config = {
    'development': DevelopmentConfig
}
Run Code Online (Sandbox Code Playgroud)

文件

from app import db, create_app
from flask_migrate import Migrate
import os
from dotenv import find_dotenv, load_dotenv

dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
if os.path.exists(dotenv_path):
    load_dotenv(dotenv_path)
    print("secret key:", os.environ.get('SECRET_KEY'))
else:
    print('no env found')

app = create_app(os.getenv('FLASK_CONFIG'))
migrate = Migrate(app, db)
Run Code Online (Sandbox Code Playgroud)

cwo*_*ork 6

IRC #pocoo 的一个好心人帮助我看到了曙光。答案就这么简单。.env 需要在导入 create_app 之前加载,它也会导入配置文件。

import os
from dotenv import find_dotenv, load_dotenv

dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
load_dotenv(dotenv_path)

from app import db, create_app
from flask_migrate import Migrate
app = create_app(os.getenv('FLASK_CONFIG'))
Run Code Online (Sandbox Code Playgroud)