我看了一个相当通用的结构来基于我的应用程序,在目录结构中看起来像这样:
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
,例如,并在应用程序中进行配置。
答案 0 :(得分: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
(docs here)的一个实例,意味着像@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