[Advanced Python] From "Flask-script" to "Click"

Ref: 从 Flask-script 迁移到 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 淘汰了

Ref: 从 Flask-script 迁移到 Click

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 */

 

posted @ 2020-11-27 13:25  郝壹贰叁  阅读(174)  评论(0编辑  收藏  举报