如何在Flask/Python中导入上级的配置文件

2 投票
2 回答
5704 浏览
提问于 2025-04-18 17:15

我正在写一个Flask的网页应用,但遇到了一个让我很困扰的小问题。这是我的microblog.py文件:

from flask import Flask
from flask import render_template, flash, redirect
from forms import LoginForm

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

@app.route('/')
@app.route('/index')
...

这是我的项目结构:

microblog\
  flask\
    <virtual environment files>
  app\
    static\
    templates\
    __init__.py
    microblog.py
    forms.py
  tmp\
  run.py
  config.py

我想问的是,为什么config.py文件必须放在应用文件夹外面,并且要高一层?我不能仅仅说这是“魔法”,所以我得找出答案,但到现在为止我一直没有成功。

我发现这可能和Python的导入系统有关(Python的导入方式真的很奇怪),但问题是,我的microblog.app.root_path是...(/Users/myname/microblog/app),所以它根本不可能看到config文件。到底发生了什么?

如果你知道答案,请帮帮我,救救我这个可怜的灵魂,免于这种疯狂。提前谢谢你!

2 个回答

1

根据这个Flask教程,run.py就是你启动应用时实际运行的文件,而且run.pyconfig.py在同一个文件夹里。当你在命令行中运行python时,当前文件夹通常会被包含在你的模块路径中,所以如果你从那个文件夹运行run.py,那么config就可以在你的路径中找到(这叫做绝对导入)。

我只是快速看了一下教程的部署部分,但它可能是依赖于microblog文件夹作为工作目录。

7

与其使用一个Python文件来做配置,为什么不试试更适合这种工作的格式呢?其中一个不错的选择是JSON,你可以像这样做(这也是官方教程第二步的变体):

import json

with open('../config.json') as f:
    config = json.load(f)

app.config.update(config)

这样,你就不需要使用config.py文件,而是可以有一个config.json文件(放在同样的位置),它可能看起来像这样:

{
    "DEBUG": true,
    "SECRET_KEY": "development key"
}

当然,你不一定要使用json,还有其他配置文件格式可以使用,具体怎么用就得你自己去查了。

撰写回答