Flask1.0.2系列(十七) 命令列介面
英文原文地址:http://flask.pocoo.org/docs/1.0/cli/
若有翻譯錯誤或者不盡人意之處,請指出,謝謝~
在你的虛擬環境中安裝Flask的時候會安裝flask指令碼——一個Click命令列介面。從終端執行,這個指令碼能夠訪問內建的、擴充套件的、以及應用程式定義的命令。--help選項能夠獲取更多關於任何命令和選項的資訊。
1. 檢測應用程式
flask命令是由Flask安裝的,而不是由你的應用程式安裝的;為了使用flask命名,你必須告訴它,哪裡能找到你的應用程式。FLASK_APP環境變數被用來指定如何載入應用程式。
Unix Bash(Linux,Mac等):
$ export FLASK_APP=hello
$ flask run
Windows CMD:
> set FLASK_APP=hello
> flask run
Windows PowerShell:
> $env:FLASK_APP = "hello"
> flask run
雖然FLASK_APP支援多種選項來指定你的應用程式,但是大多數情況都是很簡單的。這裡列出典型的值:
(nothing)
wsgi.py檔案被匯入,將自動探測一個應用(app物件)。這提供了一種簡單的方法,可以從帶有額外引數的工廠建立一個應用(app)。
FLASK_APP=hello
名字被匯入,自動探測一個應用(app物件)或者工廠(create_app)。
——————————————————————————————————————
FLASK_APP有三個部分:一個可選路徑用於設定當前工作目錄,一個Python檔案或者點(.)匯入路徑,以及一個可選的例項或者工廠的變數名稱。如果名稱是一個工廠,它可以選擇性地在括號中跟上引數。下面的值演示了上述內容:
FLASK_APP=src/hello
設定當前工作目錄到src,然後匯入hello。
FLASK_APP=hello.web
匯入路徑hello.web。
FLASK_APP="hello:create_app('dev')"
在hello中的create_app工廠被呼叫,並且有一個字串型別的引數‘dev’。
如果FLASK_APP沒有被設定,命令會尋找一個叫做wsgi.py或者app.py的檔案,並且嘗試檢測一個應用程式例項或者工廠。
在給定的匯入中,命令會尋找一個叫做app或者application的應用程式例項,然後再尋找任何應用程式例項。如果沒有找到例項,命令會查詢一個叫做create_app或者make_app的工廠方法來返回一個例項。
當呼叫一個應用程式工廠,如果工廠攜帶一個叫做info的引數,然後ScriptInfo例項會作為一個關鍵字引數傳遞進來。如果括號跟隨工廠名稱,它們的內容將被解析為Python常量,並且作為引數傳遞給這個方法。這意味著,字串必須在引號內。
2. 執行開發伺服器
run命令會執行開發伺服器。大多數情況下,它代替了Flask.run()函式。
$ flask run
* Serving Flask app "hello"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
警告:
在生產中不要使用這個命令來執行你的應用程式。僅在開發期間才會使用開發伺服器。開發伺服器是為了方便才提供的,因此它沒有被設計的安全、穩定以及有效率。
3. 開啟一個Shell
為了在你的應用程式中探測資料,你可以使用shell命令來開始一個互動式Python shell。一個應用程式上下文會被啟用,並且app例項也會被匯入。
$ flask shell
Python 3.6.2 (default, Jul 20 2017, 03:52:27)
[GCC 7.1.1 20170630] on linux
App: example
Instance: /home/user/Projects/hello/instance
>>>
使用shell_context_processor()來新增其他自動匯入。
4. 環境
(新增於版本1.0。)
Flask應用執行的環境是由FLASK_ENV環境變數設定的。如果沒有設定它,預設為production。其他認可的環境是development。Flask和擴充套件會根據環境來決定開啟某些行為。
如果env被設定為development,flask命令會開啟除錯模式,並且flask run會開啟互動式偵錯程式和過載器。
$ FLASK_ENV=development flask run
* Serving Flask app "hello"
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with inotify reloader
* Debugger is active!
* Debugger PIN: 223-456-919
5. 除錯模式
當FLASK_ENV為development時,除錯模式被開啟。如果你希望單獨地控制除錯模式,使用FLASK_DEBUG可以辦到:設為1表示開啟除錯模式,0標識禁用它。
6. 從點環境(dotenv)載入環境變數
相比於在每次開啟一個新的終端時設定FLASK_APP,你可以使用Flask支援的點環境(dotenv)來自動設定環境變數。
如果python-dotenv已經安裝,執行flask命令會從檔案.env和.flaskenv中讀取定義好的值,並設定到環境變數。這可以避免當開啟新終端時不得不手動設定FLASK_APP的操作,並且使用環境變數來設定配置,類似於一些開發服務的工作方式。
在命令列設定的變數用於那些在.env中設定的變數,這些變數用於.flaskenv中設定的變數。.flaskenv應用於公共變數,如FLASK_APP,而.env不應提交到儲存庫,以便它可以設定私有變數。
從被你成為flask的目錄開始,向上掃描以定位檔案。假定在專案的最頂層目錄,當前工作目錄將被設定為檔案的位置。
檔案僅在flask命令或者呼叫run()時才會被載入。當在生產模式下執行時,如果你想要載入這些檔案,你應該手動呼叫load_dotenv()。
6.1 設定命令選項
Click被配置為從環境變數中載入命令選項的預設值。這個變數使用模式FLASK_COMMAND_OPTION。舉個栗子,為了設定執行命令的埠,替換flask run --port 8000的方式是:
export FLASK_RUN_PORT=8000
flask run
* Running on http://127.0.0.1:8000/
這些都能被新增到.flaskenv檔案中,以便控制預設命令選項,就像是FLASK_APP的使用一樣。
6.2 禁用點環境(dotenv)
如果flask探測到了點環境(dotenv)檔案,但是python-dotenv並沒有被安裝,flask命令將顯示一條資訊。
flask run
* Tip: There are .env files present. Do "pip install python-dotenv" to use them.
你可以設定環境變數FLASK_SKIP_DOTENV來告訴Flask不要載入點環境檔案,即使python-dotenv已經安裝了。如果你想要手動載入它們,或者你使用了其他方法已經載入了它們,這個選項就很有幫助了。請記住,環境變數必須在app載入前設定,或者它的配置值沒有達到預期時才設定。
export FLASK_SKIP_DOTENV=1
flask run
7. 從虛擬環境載入環境變數
如果你不想安裝dotenv,你依然可以設定環境變數:將它們設定到虛擬環境的activate指令碼的末尾。啟用虛擬環境,這些變數就會被設定。
Unix Bash,venv/bin/activate:
export FLASK_APP=hello
Windows CMD,venv/Scripts/activate.bat:
set FLASK_APP=hello
使用dotenv的好處在於,.flaskenv能被提交到版本庫中,因此當專案被簽出時,專案也能自動地載入這些環境變數。
8. 自定義命令
使用Click可以實現flask命令。檢視這個專案的文件來獲取關於編寫命令的所有知識。
這個例子添加了帶有引數name的命令create_user:
import click
from flask import Flask
app = Flask(__name__)
@app.cli.command()
@click.argument('name')
def create_user(name):
...
flask create_user admin
這個示例添加了同樣的命令,但是命令為user create,表示一個命令在一個命令組內。如果你想組織多種相關的命令,這是很有用的:
import click
from flask import Flask
from flask.cli import AppGroup
app = Flask(__name__)
user_cli = AppGroup('user')
@user_cli.command('create')
@click.argument('name')
def create_user(name):
...
app.cli.add_command(user_cli)
flask user create demo
檢視Testing CLI Commands來複習一下如何測試你自定義的命名。
9. 應用程式上下文
通過Flask app的cli.command()裝飾器來新增命令,這個裝飾器在執行的時候會得到一個應用程式上下文,因此你的命令和擴充套件有權訪問app和它的配置。如果你通過Click的command()裝飾器建立一個命令,你可以使用with_appcontext()來獲取與Flask裝飾器相同的行為。
import click
from flask.cli import with_appcontext
@click.command
@with_appcontext
def do_work():
...
app.cli.add_command(do_work)
如果你確定一個命令不需要上下文,你可以禁用它:
@app.cli.command(with_appcontext=False)
def do_work():
...
10. 外掛
Flask會自動地載入flask.commands入口點(entry point)指定的命令。對於想要在安裝時新增命令的擴充套件來說,這是很有用的。入口點被指定在setup.py檔案中:
from setuptools import setup
setup(
name='flask-my-extension',
...,
entry_points={
'flask.commands': [
'my-command=flask_my_extension.commands:cli'
],
},
)
在flask_my_extension/commands.py內部,你可以匯出一個Click物件:
import click
@click.command()
def cli():
...
一旦在你的Flask專案所在的相同的虛擬環境下安裝了這個包,你可以執行flask my-command來呼叫這個命令。
11. 自定義指令碼
當你使用應用程式工廠模式時,它能更加方便地定義你自己的Click指令碼。相較於使用FLASK_APP並且讓Flask載入你的應用程式,你可以建立你自己的Click物件,並且匯出它就像一個console script入口點(entry point)。
建立一個FlaskGroup例項,並且將其傳給工廠:
import click
from flask import Flask
from flask.cli import FlaskGroup
def create_app():
app = Flask('wiki')
# other setup
return app
@click.group(cls=FlaskGroup, create_app=create_app)
def cli():
"""Management script for the Wiki application."""
在setup.py中定義入口點:
from setuptools import setup
setup(
name='flask-my-extension',
...,
entry_points={
'console_scripts': [
'wiki=wiki:cli'
],
},
)
在虛擬環境下,使用可編輯模式(editable mode)來安裝應用程式,然後這個自定義指令碼就是可用狀態的。
注意,你不需要設定FLASK_APP。
$ pip install -e .
$ wiki run
自定義指令碼中的錯誤:
當使用自定義指令碼時,如果你在你的模組級別程式碼引入一個錯誤,重新載入器將會失敗,因為它無法載入到進入點(entry point)。
flask命令,獨立於你的程式碼,不會有這些問題,因此大多數情況下這是推薦的方式。
12. PyCharm
在PyCharm2018.1版本中,Flask CLI特定並沒有完全整合到PyCharm中。我們不得不做一些微調以便它們能順利工作。這裡介紹的內容與其他IDE類似。
在PyCharm中,開啟你的專案,點選選單欄的Run,並且跳轉到Edit Configurations。你會看到類似於下圖的介面:
這裡有些選項需要修改。
點選+(Add New Configuration)按鈕,然後選擇Python。給這個配置一個漂亮的帶有描述性的名字,比如“Run Flask Server”。因為flask run命令的緣故,因此勾選上“Single instance only”,以便你在同一時間只能執行一次這個服務。
選擇在圖片標記A的下拉選單選擇Module name,並且輸入flask。
在圖片標記B的地方,Parameters欄位用來設定CLI命令的執行引數。在這裡我們使用run,用來執行開發伺服器。
你可以跳過下一步,如果你使用從dotenv載入環境變數的話。在圖片標記C的地方我們需要新增一個環境變數來確定我們的應用程式。點選瀏覽按鈕,新增一個條目,左邊輸入FLASK_APP,右邊輸入Python匯入或者檔案(這裡輸入hello)。
接下來我們需要在圖片標記D的地方設定工作目錄,這個工作目錄就是我們應用程式所在的資料夾。
如果你已經將你的專案作為包安裝在了虛擬環境中,你需要在圖片標記E的地方勾選上PYTHONPATH選項。這可以更精確地匹配到你在稍後會如何部署你的app。
點選Apply按鈕來儲存這個配置,或者OK來儲存並關閉這個窗體。在PyCharm主窗體選擇這個配置,並且點選play按鈕來執行這個服務。
現在,我們在PyCharm中已經有一個執行flask run命令的配置。我們可以複製這個配置,並且修改指令碼引數來執行不同的CLI命令,比如flask shell。