在flask中使用python-dotenv+flask-cli自定義命令(推薦)
最近在重構(gòu) flask 項目的時候發(fā)現(xiàn)項目的環(huán)境變量異常的混亂,非常不便于管理。而且,更重要的事情是我需要通過自定義命令來運行 devlopment 和 production 兩種項目環(huán)境。
自定義命令工具——flask-cli
在Flask 1.0+ 中已經(jīng)支持了flask-cli,在翻閱了flask-cli文檔之后,發(fā)現(xiàn)文檔中提供的自定義命令的方法約束還是有點多,而且介紹的也不是特別詳細(xì)。后來,通過查看flask-cli的源碼發(fā)現(xiàn)flask-cli是基于Click開發(fā)的。
Click is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary. It's the “Command Line Interface Creation Kit”. It's highly configurable but comes with sensible defaults out of the box.
Click是一個可以使用簡潔代碼和組合方法來創(chuàng)建漂亮的命令行命令的Python包。它還是一個高度可配置的,具有合理的默認(rèn)設(shè)置的命令行工具創(chuàng)建工具包。
管理環(huán)境變量——python-dotenv
在使用flask-cli的時候,為了不需要每次都在 flask run 之前都引入環(huán)境變量。官方文檔中提了 python-dotenv ,需要在項目中創(chuàng)建 .env 和 .flaskenv 兩個文件。
命令行設(shè)置的變量會重載 .env 中的變量, .env 中的變量會重載 .flaskenv 中的變量。 .flaskenv 應(yīng)當(dāng)用于公共變量,如 FLASK_APP 而 .env 則應(yīng)用用于私有變量,并且不提交到儲存庫。
在使用 python-dotenv 之前還需要通過 pip 去安裝依賴包(我這里使用的 pipenv ):
pipenv install python-dotenv
在 .env 文件中一般寫一些私有變量或者是涉及到隱私的變量,即使不上傳到 git 上也不影響程序運行的這種。
下面以 .flaskenv 中的幾個變量為例:
# .flaskenv FLASK_APP = "app" FLASK_ENV = "development" FLASK_RUN_HOST = '0.0.0.0' FLASK_RUN_PORT = '5000'
讀取環(huán)境變量
這里介紹如何在項目讀取變量的方法:
import os
from dotenv import load_dotenv
# 加載環(huán)境變量文件,dotenv_path默認(rèn)值為.env,override是表示是否可以重載,默認(rèn)值為False
load_dotenv(dotenv_path='.flaskenv',override=True)
# 讀取環(huán)境變量 FLASK_ENV,通過os.getenv()方法中引入字段名稱來讀取
env = os.getenv("FLASK_ENV")
print(env)
自定義命令
這里我的項目的入口文件為 app.py
# app.py
import click
import os
from os.path import dirname,join
from dotenv import load_dotenv
# 加載變量文件
load_dotenv(dotenv_path='.flaskenv')
'''
下面這一段代碼是根據(jù)在命令行中傳入的dev的值來執(zhí)行不同的命令,從而達到一個命令區(qū)分開發(fā)環(huán)境和生產(chǎn)環(huán)境
'''
@click.command()
@click.option('--dev', default=os.getenv("FLASK_ENV"),help='environment variable')
def runserver(dev):
os.system("FLASK_ENV=%s flask run" % (dev))
if __name__ == '__main__':
runserver()
運行代碼:
# 開發(fā)環(huán)境 python app.py 或者 python app.py --dev=development # 生產(chǎn)環(huán)境 python app.py --dev=production
目前,第一階段就做了這么多,其中還有很多不足之處,希望大家?guī)兔μ岢鳇c意見,后續(xù)我有更多的做法,也會第一時間更新這些內(nèi)容。
總結(jié)
以上所述是小編給大家介紹的在flask中使用python-dotenv+flask-cli自定義命令,希望對大家有所幫助!
相關(guān)文章
python 不關(guān)閉控制臺的實現(xiàn)方法
在win32下,雙擊python程序會打開dos窗口,但是執(zhí)行完畢后就會關(guān)閉,看不到輸出的結(jié)果2011-10-10
Python用HBuilder創(chuàng)建交流社區(qū)APP
這篇文章主要講解Python使用HBuilder創(chuàng)建交流社區(qū)APP,使用HBuilder做一個簡單的社區(qū)瀏覽界面,下面文章附有詳細(xì)的代碼,需要的朋友可以參考一下2021-11-11
淺談Python數(shù)學(xué)建模之線性規(guī)劃
線性規(guī)劃是運籌學(xué)中研究較早、發(fā)展較快、應(yīng)用廣泛、方法較成熟的一個重要分支,它是輔助人們進行科學(xué)管理的一種數(shù)學(xué)方法。研究線性約束條件下線性目標(biāo)函數(shù)的極值問題的數(shù)學(xué)理論和方法2021-06-06
Python機器學(xué)習(xí)pytorch交叉熵?fù)p失函數(shù)的深刻理解
這篇文章主要為大家介紹了Python機器學(xué)習(xí)中對交叉熵?fù)p失函數(shù)的深刻理解,文中作出了詳細(xì)易懂的講解,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10
Python編程pytorch深度卷積神經(jīng)網(wǎng)絡(luò)AlexNet詳解
AlexNet和LeNet的架構(gòu)非常相似。這里我們提供了一個稍微精簡版本的AlexNet,去除了當(dāng)年需要兩個小型GPU同時運算的設(shè)計特點2021-10-10
使用Django框架中ORM系統(tǒng)實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)增刪改查
這篇文章主要介紹了使用Django的ORM實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)增刪改查方法,文中附含詳細(xì)示例代碼以及過程詳解,有需要的朋友可以借鑒參考下2021-09-09

