使用FLASK_APP和App Factory

时间:2017-12-10 05:04:01

标签: 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/了,我无法完全按照它来获取我所追求的内容。我尝试导出FLASK_CONFIG =开发作为我的最后一次尝试,看看它是否能正常工作,但事实并非如此。所以我的问题是,我如何使用flask运行,让它正确运行我的应用程序,而不是运行'python pg.py'

编辑:除了配置外,我注意到一切正常。不确定我错过了什么。根据我的阅读,我觉得FLASK_CONFIG =开发应该有效。这几乎就好像应用程序是使用'app = Flask( name )'创建的,跳过配置加载,然后进入蓝图注册。为什么?我知道我可以在运行之前导出所有敏感信息,并且这样做,但现在我一直试图找出问题,并且在我理解之前无法让它继续:/

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

应用程序/ __初始化__。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

config.py

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
}

pg.py

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)

1 个答案:

答案 0 :(得分:3)

在IRC #pocoo的一个善良的灵魂帮助我看到了光明。答案很简单。在导入create_app之前需要加载.env,这也会导入配置文件。

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'))