其實(shí)本質(zhì)都是python-dotenv加載環(huán)境變量出現(xiàn)的問題惕它。
坑一:python-dotenv加載的Value都是字符串類型
第一個坑是python-dotenv加載的Value都是字符串類型(python-dotenv
版本0.10.1)货矮,因此導(dǎo)致整型、浮點(diǎn)型和布爾類型需要轉(zhuǎn)換一下榴徐。
解決方案
目前解決辦法只能是這樣:
# `.env`
MAIL_PORT = 465
MAIL_USE_SSL = false
MAIL_USE_TLS = true
# settings.py
class BaseConfig(object):
...
MAIL_PORT = int(os.getenv('MAIL_PORT', default=587))
MAIL_USE_SSL = True if 'true' == os.getenv('MAIL_USE_SSL') else False
MAIL_USE_TLS = True if 'true' == os.getenv('MAIL_USE_TLS') else False
相關(guān)帖子:https://discuss.helloflask.com/t/topic/127/3?u=angelliang
坑二:pipenv影響了flask加載.env
環(huán)境變量
第二個坑和pipenv
有關(guān)学少,眾所周知Flask項(xiàng)目可以通過.env
加載環(huán)境變量幔崖,但是信认,pipenv
也可以通過.env
加載環(huán)境變量!問題就出現(xiàn)了青责,進(jìn)入pipenv shell
虛擬環(huán)境后挺据,修改.env環(huán)境變量后再啟動Flask app:flask run
,F(xiàn)lask還是用了原來的環(huán)境變量2绷ァ1饽汀!
究其原因产阱,是pipenv shell
加載了環(huán)境變量并進(jìn)行了緩存婉称,然后flask加載環(huán)境變量時沒有進(jìn)行覆蓋
> pipenv shell
Loading .env environment variables…
Launching subshell in virtual environment…
...
> flask run # 正常預(yù)期
# 停止flask,修改 .env 環(huán)境變量构蹬,保存
> flask run # 沒達(dá)到修改變量后的預(yù)期效果
尤其是部署Flask到服務(wù)器后王暗,以下步驟肯定有問題的!W病俗壹!
$ pipenv shell $ vim .env ... $ flask run
解決方案
方案一:重進(jìn)pipenv shell
一種解決方案就是退出pipenv shell
環(huán)境再進(jìn)入:
> pipenv shell
> # 編輯 .env
...
> exit
> pipenv shell
方案二:新建并使用app.py
啟動
另一個解決方案是在主目錄下新建一個app.py
,拷貝下面代碼藻烤,以后使用python app.py
啟動绷雏。
# coding=utf-8
"""
python app.py
"""
import os
from dotenv import load_dotenv
dotenv_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path, override=True) # override=True: 覆寫已存在的變量
from apps.web import create_app
app = create_app()
if __name__ == "__main__":
app.run()
這種代碼有時也會給一些wsgi(比如gunicorn)提供头滔。
方案三:設(shè)置PIPENV_DONT_LOAD_ENV=1
還有一個方案是設(shè)置PIPENV_DONT_LOAD_ENV=1
,不讓pipenv加載.env
涎显。
PowerShell示例(注意沒有了Loading .env environment variables…
信息):
> $env:PIPENV_DONT_LOAD_ENV=1
> pipenv shell
Launching subshell in virtual environment…
Windows PowerShell
...
方案四:使用.flaskenv
pipenv shell
不會從.flaskenv
加載變量坤检,所以如果有經(jīng)常需要修改的環(huán)境變量也可以放在.flaskenv
。但是我感覺一點(diǎn)也不優(yōu)雅期吓,因?yàn)槲伊?xí)慣把.flaskenv
也提交到倉庫早歇,而留下.env
在部署端客制化。
相同帖子:https://discuss.helloflask.com/t/topic/128
如果有其他疑問膘婶,歡迎到HelloFlask論壇提問缺前。