天天看點

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.py

app.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