在运行Flask应用时如何传递数据给配置?
我查看了一个比较通用的结构,打算以此为基础来搭建我的应用,目录结构大概是这样的:
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.cli
是click.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