flask命令在Flask庫(kù)安裝后可使用轻猖,使用前需要正確配置FLASK_APP
環(huán)境變量以告知用戶程序所在位置能扒。不同平臺(tái)設(shè)置方式有所不同嫁蛇。
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
環(huán)境變量分三部分:
- 一個(gè)設(shè)置當(dāng)前工作目錄的可選路徑
- 一個(gè)python文件或帶"."的導(dǎo)入路徑
- 一個(gè)可選的應(yīng)用實(shí)例或工廠函數(shù)變量名坎弯。如果是工廠函數(shù),可以后跟括號(hào)傳入要接收的參數(shù)桦锄。
FLASK_APP=src/hello
設(shè)置src為當(dāng)前工作目錄幔亥,并導(dǎo)入hello
FLASK_APP=hello.web
導(dǎo)入hello.web
FLASK_APP=hello:app2
使用hello中的app2實(shí)例
FLASK_APP=hello:create_app('dev')
使用hello中的工廠函數(shù)create_app并傳入?yún)?shù)dev
注意:
如果未設(shè)置
FLASK_APP
,flask
命令會(huì)查找wsgi.py
或app.py
文件并探測(cè)應(yīng)用實(shí)例或工廠函數(shù)察纯。flask
命令在給定的導(dǎo)入內(nèi)尋找一個(gè)名為app
或者application
的應(yīng)用實(shí)例,如果找不到會(huì)繼續(xù)尋找任意應(yīng)用實(shí)例针肥。如果找不到任何實(shí)例饼记,會(huì)接著尋找名為create_app
或者make_app
的工廠函數(shù),使用該函數(shù)返回的實(shí)例慰枕。
flask run
運(yùn)行開(kāi)發(fā)服務(wù)器具则。不消說(shuō),不要在生產(chǎn)環(huán)境使用
flask shell
開(kāi)啟一個(gè)交互式的python shell
具帮,用來(lái)訪問(wèn)或處理應(yīng)用數(shù)據(jù)博肋。該指令默認(rèn)激活應(yīng)用上下文低斋,并導(dǎo)入應(yīng)用實(shí)例。
只有應(yīng)用實(shí)例是默認(rèn)導(dǎo)入的匪凡,如果需要導(dǎo)入其他對(duì)象膊畴,使用shell_context_processor
裝飾函數(shù),返回一個(gè)字典對(duì)象病游,鍵值對(duì)表示額外導(dǎo)入的對(duì)象唇跨。
from exts import db, models
@app.shell_context_processor
def make_shell_context():
return dict(models=models, db=db)
flask db
執(zhí)行數(shù)據(jù)庫(kù)遷移相關(guān)操作。flask db
指令不能直接使用衬衬,需要獲取Migrate
實(shí)例买猖。
from flask_migrate import Migrate
migrate = Migrate(app, db)
環(huán)境
通過(guò)FLASK_ENV
變量設(shè)置Flask應(yīng)用的運(yùn)行環(huán)境∽涛荆可選值包括production
(默認(rèn))和development
玉控。
如果設(shè)置為development
,flask
命令將激活debug
模式狮惜,執(zhí)行flask run
會(huì)啟用交互式調(diào)試器和代碼自動(dòng)重載高诺。
DEBUG模式
設(shè)置FLASK_ENV
為development
時(shí),會(huì)自動(dòng)激活debug
模式讽挟。也可以通過(guò)FLASK_DEBUG
變量單獨(dú)控制懒叛,1表示啟用,0表示禁用
通過(guò)dotenv設(shè)置環(huán)境變量
略
通過(guò)virtualenv設(shè)置環(huán)境變量
略
自定義命令
flask命令基于Click庫(kù)實(shí)現(xiàn)耽梅。
下列代碼演示添加帶有name參數(shù)的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)
運(yùn)行方式:flask print-user root
薛窥。注意這里的指令是print-user
,如果想使用其他指令調(diào)用眼姐,可以在app.cli.command()
中傳入 "你想要的指令"
诅迷。
下列代碼演示了和上面相同的功能,但將打印用戶的命令添加到了user
命令組众旗。命令組可用于管理多個(gè)相關(guān)的命令:
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)
運(yùn)行方式:flask user print root
應(yīng)用上下文
使用Flask
應(yīng)用的.cli.command()
裝飾器添加的命令在執(zhí)行時(shí)自動(dòng)推入應(yīng)用上下文罢杉。
如果使用Click
的command()
裝飾器添加命令,執(zhí)行時(shí)不會(huì)自動(dòng)推入應(yīng)用上下文贡歧,要想達(dá)到同樣的效果滩租,增加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)
如果命令不需要在應(yīng)用上下文中執(zhí)行,可以顯示地禁用:
@app.cli.command(with_appcontext=False)
def do_work():
pass