其實本質(zhì)都是python-dotenv加載環(huán)境變量出現(xiàn)的問題。
坑一:python-dotenv加載的Value都是字符串類型
第一個坑是python-dotenv加載的Value都是字符串類型(python-dotenv版本0.10.1),因此導致整型、浮點型和布爾類型需要轉(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
相關帖子:https://discuss.helloflask.com/t/topic/127/3?u=angelliang
坑二:pipenv影響了flask加載.env環(huán)境變量
第二個坑和pipenv有關,眾所周知Flask項目可以通過.env加載環(huán)境變量,但是,pipenv也可以通過.env加載環(huán)境變量!問題就出現(xiàn)了,進入pipenv shell虛擬環(huán)境后,修改.env環(huán)境變量后再啟動Flask app:flask run,F(xiàn)lask還是用了原來的環(huán)境變量!?。?/p>
究其原因,是pipenv shell加載了環(huán)境變量并進行了緩存,然后flask加載環(huán)境變量時沒有進行覆蓋
> pipenv shell
Loading .env environment variables…
Launching subshell in virtual environment…
...
> flask run # 正常預期
# 停止flask,修改 .env 環(huán)境變量,保存
> flask run # 沒達到修改變量后的預期效果
尤其是部署Flask到服務器后,以下步驟肯定有問題的!??!
$ pipenv shell $ vim .env ... $ flask run
解決方案
方案一:重進pipenv shell
一種解決方案就是退出pipenv shell環(huá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)提供。
方案三:設置PIPENV_DONT_LOAD_ENV=1
還有一個方案是設置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。但是我感覺一點也不優(yōu)雅,因為我習慣把.flaskenv也提交到倉庫,而留下.env在部署端客制化。
相同帖子:https://discuss.helloflask.com/t/topic/128
如果有其他疑問,歡迎到HelloFlask論壇提問。