如何从 Flask 中的配置文件导入?

Posted

技术标签:

【中文标题】如何从 Flask 中的配置文件导入?【英文标题】:How to import from config file in Flask? 【发布时间】:2013-02-13 20:43:19 【问题描述】:

我从 http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world 开始遵循我的 Flask 项目的布局。

我有以下结构:

app/
    __init__.py
    views.py
    forms.py
    myFile.py
run.py
config.py

在views.py、forms.py中我可以使用

from config import basedir

但是我不能在 myFile.py 中使用它

我加了

import Flask 

当我修改它时,Flask 网络服务器会重新启动,但它并没有说在 app/myFile.py 中找到更改重新启动它只是重新启动。

我需要做什么才能使用

from config import basedir

在我的 python 文件中。我没有看到在 __init__.py 中为 forms.py 做了什么特别的事情。

编辑:这是我的__init__.py 文件:

from flask import Flask
from config import basedir

app = Flask(__name__)
app.config.from_object('config')
from app import views

【问题讨论】:

【参考方案1】:

当人们谈论 Flask 中的配置时,他们通常是在谈论将值加载到应用程序的配置中。在您上面的示例中,您的 init.py 文件中可能有类似 app.config.from_object('config') 的内容。然后所有配置值将被加载到app.config 字典中。

然后在您的任何文件中,您只需导入应用程序对象即可访问该字典。我倾向于通过from flask import current_app as app 访问该app 对象,然后只需app.config['MY_SETTING'] 即可获得我关心的值。 Read up more in the documenation.

【讨论】:

我的 init.py 文件中有 app.config.from_object('config')。你知道为什么“from config import basedir”在views.py和forms.py中有效吗? 谢谢伙计。在文档中。没有说明如何从其他文件访问配置设置。【参考方案2】:

经过一番摆弄(以及来自网络的一点帮助),我可以进一步改进这一点,方法是将代码更改为包含配置:

app.config.from_object('config.ProductionConfig')

这为配置启用了这种很酷的模式:

class Config(object):
    DEBUG = True
    DEVELOPMENT = True
    SECRET_KEY = 'do-i-really-need-this'
    FLASK_HTPASSWD_PATH = '/secret/.htpasswd'
    FLASK_SECRET = SECRET_KEY
    DB_HOST = 'database' # a docker link

class ProductionConfig(Config):
    DEVELOPMENT = False
    DEBUG = False
    DB_HOST = 'my.production.database' # not a docker link

现在剩下的就是看看如何将测试配置集成到其中,但至少感觉不那么笨拙。

【讨论】:

app.config.from_object 如何知道配置模块?我有config 模块和__init__.py 模块。我不断收到此错误:ImportStringError: import_string() failed for 'config.ProductionConfig' 我看到了同样的错误。我的可安装应用程序代码位于app/src/myapp/,我的__init__.py 也位于其中。因此INSTANCE_PATHapp/src/instance/。你能解决这个@Ciastopiekarz 吗? 这里应该是app.config.from_object('config.ProductionConfig') 而不是app.config.from_object(config.ProductionConfig),其中configConfig 类的一个实例? @greg 不,from_object 接受一个字符串,然后用于动态导入模块。见flask.palletsprojects.com/en/1.1.x/config/…。是的,它的名字很糟糕而且非常混乱。使用字符串来引用模块也不是最好的主意 - 降低了 IDE 跟踪使用情况的能力。 这就是忘记了良好设计的新语言的全部问题;这不酷。是代码还是配置?代码和配置应该分开。 12factor.net【参考方案3】:

我在我的烧瓶项目 - 根文件夹中创建了一个 config.json 文件,如下所示:

config.json


    "mail_settings":
        "MAIL_SERVER": "smtp.gmail.com",
        "MAIL_PORT": 465,
        "MAIL_USE_TLS": "False",
        "MAIL_USE_SSL": "True",
        "MAIL_USERNAME": "your_mail@gmail.com",
        "MAIL_PASSWORD": "your_password"
    ,
    "database":
        "mysql_HOST":"localhost",
        "MYSQL_USER": "user_name",
        "MYSQL_PASSWORD":"password",
        "MYSQL_DB":"database_name"
    

只需在我们想要访问配置值的地方添加下面的代码。例如,我将在 app.py 中使用如下:

首先导入flask json库:

import json

第二次打开文件以读取json并将其存储在一些变量中,如下所示:

with open('config.json') as config_file:
    config_data = json.load(config_file)

在创建 Flask 应用程序后添加以下代码,命名为 app app = Flask(__name__),如下所示,用于访问 config.json - 配置值。

# mail configuration
mail_settings = config_data['mail_settings']
app.config.update(mail_settings)

# database configuration
db_settings = config_data['database']
app.config.update(db_settings)

【讨论】:

在投票之前,我的要求是我们必须解释错误的部分。 @Siva,在 Flask 应用程序中,我们可以在根文件夹中创建一个 config.py 文件进行配置。 OP & 每个人都在讨论那个 config.py 文件。 flask.palletsprojects.com/en/1.1.x/config/… 对不起,当我开始创建配置文件时,我没有正确检查文件,无论我在项目中使用哪个进行配置,@SarathlalN Tnx 给你,我现在可以理解我的错误了。

以上是关于如何从 Flask 中的配置文件导入?的主要内容,如果未能解决你的问题,请参考以下文章

如何定义一个连接Flask python文件的数据库然后导入它?

Flask配置文件和环境变量:配置文件和环境变量的读取与调用

尝试在 Apache2 上使用 WSGI 部署 Flask 时如何解决导入错误

ImportError:无法从“flask”导入名称“request”

无法从 flask_migrate 导入 MigrateCommand

Flask,Pymongo和Mongoengine - ImportError:无法导入名称'app'