1. 程式人生 > >Flask內建命令列工具—CLI

Flask內建命令列工具—CLI

應用發現

flask命令在Flask庫安裝後可使用,使用前需要正確配置FLASK_APP環境變數以告知使用者程式所在位置。不同平臺設定方式有所不同。

Unix Bash (Linux, Mac, etc.):


$ export FLASK_APP=hello
$ flask run

Windows CMD:


> set FLASK_APP=hello
> flask run

Windows PowerShell:


> $env:FLASK_APP="hello"
> flask run

FLASK_APP環境變數分三部分:一個設定當前工作目錄的可選路徑,一個python檔案或帶"."的匯入路徑,一個可選的應用例項或工廠函式變數名。如果是工廠函式,可以後跟括號傳入要接收的引數。

FLASK_APP=src/hello
設定src為當前工作目錄,並匯入hello

FLASK_APP=hello.web
匯入hello.web

FLASK_APP=hello:app2
使用hello中的app2例項

FLASK_APP=hello:create_app('dev')
使用hello中的工廠函式create_app並傳入引數dev

如果未設定FLASK_APP,flask命令會查詢wsgi.pyapp.py檔案並探測應用例項或工廠函式。flask命令在給定的匯入內尋找一個名為app或者application的應用例項,如果找不到會繼續尋找任意應用例項。如果找不到任何例項,會接著尋找名為create_app

或者make_app的工廠函式,使用該函式返回的例項。

flask run

執行開發伺服器。不消說,不要在生產環境使用

flask shell

開啟一個互動式的python shell,用來訪問或處理應用資料。該指令預設啟用應用上下文,並匯入應用例項。

只有應用例項是預設匯入的,如果需要匯入其他物件,使用shell_context_processor裝飾函式,返回一個字典物件,鍵值對錶示額外匯入的物件。


from exts import db, models

@app.shell_context_processor
def make_shell_context():
    return dict(models=models, db=db)

flask db

執行資料庫遷移相關操作。flask db指令不能直接使用,需要獲取Migrate例項。


from flask_migrate import Migrate

migrate = Migrate(app, db)

環境

通過FLASK_ENV變數設定Flask應用的執行環境。可選值包括production(預設)和development
如果設定為development,flask命令將啟用debug模式,執行flask run會啟用互動式偵錯程式和程式碼自動過載。

DEBUG模式

設定FLASK_ENV為development時,會自動啟用debug模式。也可以通過FLASK_DEBUG變數單獨控制,1表示啟用,0表示禁用

通過dotenv設定環境變數

通過virtualenv設定環境變數

自定義命令

flask命令基於Click庫實現。
下列程式碼演示新增帶有name引數的print-user命令:


import click
from flask import Flask

app = Flask(__name__)

@app.cli.command()
@click.argument("name")
def print_user(name):
    print("this is", name)

執行方式:flask print-user root注意這裡的指令是print-user,使用print_user會提示沒有這個指令,除非顯示地在app.cli.command()中傳入"print_user"。

下列程式碼演示了和上面相同的功能,但將列印使用者的命令新增到了user命令組。命令組可用於管理多個相關的命令:


import click
from flask import Flask
from flask.cli import AppGroup

app = Flask(__name__)
user_cli = AppGroup("user")

@user_cli.command("print")
@click.argument("name")
def print_user(name):
    print("this is", name)

app.cli.add_command(user_cli)

執行方式:flask user print root

要測試自定義命令,參考Testing CLI Commands

應用上下文

使用Flask應用的.cli.command()裝飾器新增的命令在執行時自動推入應用上下文。

如果使用Click的command()裝飾器新增命令,執行時不會自動推入應用上下文,要想達到同樣的效果,增加with_appcontext裝飾器:


import click
from flask import Flask, current_app
from flask.cli import with_appcontext

app = Flask(__name__)

@click.command()
@with_appcontext
def do_work():
    print("do work")
    print(current_app)

app.cli.add_command(do_work)

如果命令不需要在應用上下文中執行,可以顯示地禁用:


@app.cli.command(with_appcontext=False)
def do_work():
    pass

外掛

略(在setup.py中配置entry_points->flask.commands的值)

自定義指令碼

略(針對使用工廠函式生成應用例項的情況,在setup.py中配置entry_points->console_scripts的值)

PyCharm 整合

來源:https://segmentfault.com/a/1190000017436977