在运行Flask应用时如何传递数据给配置?

1 投票
1 回答
2116 浏览
提问于 2025-04-18 06:43

我查看了一个比较通用的结构,打算以此为基础来搭建我的应用,目录结构大概是这样的:

run.py
config.py
app/
  __init__.py
  views.py
  blueprints/
  sql/

我在我的 config.py 文件里放了一些变量,然后在应用启动时,__init__.py 会读取这些变量。有些部分是完全固定的,不需要改动,但有些地方我希望在每次运行时可以调整。例如,queries = [x for x in os.listdir(os.path.join(_basedir, sql_path))] 这里的 sql_path 是可以配置的,或者我想改变 port_number

理想情况下,我希望能在 run.py 脚本中使用命令行参数来配置这些设置。我的第一反应是在 run.py 中这样做:

from app import app
import argparse
import os

_basedir = os.path.abspath(os.path.dirname(__file__))
parser = argparse.ArgumentParser(description='run the app')
parser.add_argument('--port', type=int, default=1225)
parser.add_argument('--sql_path', type=str, default='/app/sql/')
parser.add_argument('--debug', type=boolean, default=False)
args = parser.parse_args()

app.config['queries'] = [x for x in os.listdir(os.path.join(_basedir, args.sql_path))]
app.config['port_number'] = args.port
app.config['debug'] = args.debug

app.run(debug=args.debug, port=app.config['port_number'])

这样做会导致在运行应用时出现 KeyError 错误,提示说 sql_path 没有配置,因为有一个蓝图需要用到它。

有没有办法通过命令行参数来配置这个呢?我希望能够像这样运行 python run.py --sql_path=../sql/ --port_number=5000,然后让应用根据这些参数进行配置。

1 个回答

2

你可以通过Flask提供的一个装饰器来实现这个功能:

from flask import Flask

app = Flask(__name__)

@app.cli.command()
def initdb():
    """Initialize the database."""
    print 'Init the db'

然后在命令行中调用这个函数,可以这样写:

$ flask -a hello.py initdb

Flask使用了Click这个包来处理命令行参数,所以在这里能用的东西,Flask里也能用。

app.cliclick.Group的一个实例(详细信息可以查看文档),这意味着像@click.option()这样的功能可以很顺利地转换成@app.cli.option()

如果你想传递一个选项,可能会像这样:

@app.cli.command()
@app.cli.option('--test', help='test')
def takearg(test):
    print test

然后可以这样调用它:

$ flask -a hello.py --test=teststring

撰写回答