内置接口:

说明: 旧版启动APP应用的主机地址,端口,是否开启DEBUG,是否多线程等参数都必须写死在代码中,新版FLASK集成了Click,支持直接在命令行中直接执行FLASK命令启动FLASK应用了,但是缺点是只能在类Linux的系统上使用,在Windows上使用可能会出现failed to create process错误,如果遇到这种问题可使用Flask-Script跨平台命令行管理

Usage: flask [OPTIONS] COMMAND [ARGS]...
  This shell command acts as general utility script for Flask applications.
  It loads the application configured (either through the FLASK_APP
  environment variable) and then provides commands either provided by the
  application or Flask itself.
  The most useful commands are the "run" and "shell" command.
  Example usage:
    $ export FLASK_APP=hello
    $ export FLASK_DEBUG=1
    $ flask run
Options:
  --help  Show this message and exit.
Commands:
  db     Perform database migrations.
  run    Runs a development server.
  shell  Runs a shell in the app context.

说明: 可以发现新版FLASK命令行接口非常强大,只需要配置两个环境变量,剩余的直接命令行支持db(内置数据库迁移命令),run(内置app运行指令),shell(内置程序上下文的调试shell),具体指令可以在Linux上尝试flask db/run/shell查看其子命令


接口扩展:

说明: 其实FLASK还给我们预留了添加自定义命令的接口app.cli.command(),方便我们扩展flask子命令,如果是Linux工作的同学可以用其完全代替Flask-Script扩展


#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://xmdevops.blog.51cto.com/
# Purpose:
#
"""
# 说明: 导入公共模块
import click
from flask import Flask
# 说明: 导入其它模块
app = Flask(__name__)
@app.cli.command()
@click.option('--yes', prompt='Do you want drop exists?', is_flag=True)
def dbcreate(*args, **kwargs):
    click.echo(kwargs)
    if kwargs.get('yes', False):
        click.echo('db create')
    else:
        click.echo('db exists')
@app.cli.command()
@click.option('--yes', prompt='Do you want to continue?', is_flag=True)
def dbdelete(*args, **kwargs):
    click.echo(kwargs)
    if kwargs.get('yes', False):
        click.echo('delete db')
    else:
        click.echo('faild del')

export FLASK_APP='main.py'
export FLASK_DEBUG=1
flask run -h 0.0.0.0 -p 9000
flask dbdelete
flask dbcreate

说明: 常用的扩展方式首先被装饰的函数最好可以接收不固定参数,因为有可能有选项,选项的数据是通过字典的形式传递进来的,然后使用@app.cli.command()首先基于app程序上下文创建一个以被修饰的函数名为键以其命令及选项为值的字典,而@click.option('--yes', prompt='Do you want to continue?', is_flag=True)修饰器则通过被修饰的函数名在app实例中找到对应字典中的命令对象,然后添加选项,它的第一个参数是选项名,必须以--开头,prompt为提示信息,is_flag表示是否需要[Y/N]的提示标志,默认会将{'yes': True/False}的值传递给被修饰的函数,但是如果不想传递的话可以指定expose_value=False,选项以及选项值传递进去后至于怎么处理就靠自己发挥了~