在运行烧瓶应用程序时将数据交给配置?

时间:2014-05-15 23:05:23

标签: python 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 个答案:

答案 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.cliclick.Groupdocs 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