[Advanced Python] From "Flask-script" to "Click"
@click.group()
一、'函数' 变成 '命令'
将一个普通的函数转化为一个命令行工具,还为它提供了选项、参数等,并且自动生成了帮助信息。
import click @click.group() defgit(): '''These are common Git commands used in various situations:''' pass
########################################################################
@git.command() def clone(): '''Clone a repository into a new directory''' click.echo('Clone a repository!') @click.option('--count', default=1, help='number of greetings') @click.argument('name') @git.command() def init(count, name): '''Create an empty Git repository or reinitialize an existing one''' click.echo('Create an empty Git repository!') for x in range(count): click.echo('Hello %s!' % name)
if __name__ == '__main__': git()
二、实战演练
看不太懂,哈哈哈啊。
import click, logging from server import create_app from flask.cli import FlaskGroup, ScriptInfo from server.module import db from sqlalchemy_utils import database_exists, create_database from server.models.user import User logger = logging.getLogger(__name__) class ServerGroup(FlaskGroup): def __init__(self, *args, **kwargs): super(ServerGroup, self).__init__(*args, **kwargs) def make_app(script_info): config_file = getattr(script_info, "config_file", None) return create_app(config_file) def set_config(ctx, param, value): """This will pass the config file to the create_app function.""" ctx.ensure_object(ScriptInfo).config_file = value
因为 click.group,让函数 server有了魔法,可以如何如何。
@click.group(cls=ServerGroup, create_app=make_app, add_version_option=False, invoke_without_command=True) @click.option("--config", expose_value=False, callback=set_config, required=False, is_flag=False, is_eager=True, metavar="CONFIG", help="using a path like '/path/to/xxxx.cfg'") @click.pass_context def server(ctx): """This is the commandline interface for server.""" if ctx.invoked_subcommand is None: # show the help text instead of an error # when just '--config' option has been provided click.echo(ctx.get_help())
初始化 db。
@server.command() @click.option("--username", "-u", help="The username of the user.") @click.option("--password", "-p", help="The password of the user.") def initDB(username, password): '''Create a database and add the first user''' if database_exists(db.engine.url): click.echo('The database is exists!') else: create_database(db.engine.url) db.create_all(bind=None) user = User.create( name=username, password=password)
FlaskGroup
一、flask-script 淘汰了
Flask-script 对应的 github 也显示项目不再维护了,而 Flask 项目也引入了新的拓展 Click 可以代替 Flask-script,于是替换之。
对于 Flask 框架而言,可以使用 Flask 中继承自 click.group()
的类 FlaskGroup
,使用更便利。
通过一番折腾,可以将 Flask-script 的依赖彻底去除了。
二、FlaskGroup 的使用
manage.py
import sys from flask.cli importFlaskGroup from src import create_app, db # new from src.api.models import User # new app = create_app() # new cli = FlaskGroup(create_app=create_app) # new @cli.command('recreate_db') def recreate_db(): db.drop_all() db.create_all() db.session.commit() if __name__ == '__main__': cli()
如此写,就可以通过下面的方式,直接invode 函数 recreate_db(),更为方便。
$ docker-compose exec api python manage.py recreate_db
/ *continue */