關于Flask通過.env加載環(huán)境變量的兩個坑

其實本質(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論壇提問。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容