其实本质都是python-dotenv加载环境变量出现的问题。
坑一:python-dotenv加载的Value都是字符串类型
第一个坑是python-dotenv加载的Value都是字符串类型(python-dotenv版本0.10.1),因此导致整型、浮点型和布尔类型需要转换一下。
解决方案
目前解决办法只能是这样:
1 | # `.env` |
1 | # settings.py |
相关帖子:https://discuss.helloflask.com/t/topic/127/3?u=angelliang
坑二:pipenv影响了flask加载.env环境变量
第二个坑和pipenv有关,众所周知Flask项目可以通过.env加载环境变量,但是,pipenv也可以通过.env加载环境变量!问题就出现了,进入pipenv shell虚拟环境后,修改.env环境变量后再启动Flask app:flask run,Flask还是用了原来的环境变量!!!
究其原因,是pipenv shell加载了环境变量并进行了缓存,然后flask加载环境变量时没有进行覆盖
1 | > pipenv shell |
尤其是部署Flask到服务器后,以下步骤肯定有问题的!!!
1
2
3
4 $ pipenv shell
$ vim .env
...
$ flask run
解决方案
方案一:重进pipenv shell
一种解决方案就是退出pipenv shell环境再进入:
1 | > pipenv shell |
方案二:新建并使用app.py启动
另一个解决方案是在主目录下新建一个app.py,拷贝下面代码,以后使用python app.py启动。
1 | # coding=utf-8 |
这种代码有时也会给一些wsgi(比如gunicorn)提供。
方案三:设置PIPENV_DONT_LOAD_ENV=1
还有一个方案是设置PIPENV_DONT_LOAD_ENV=1,不让pipenv加载.env。
PowerShell示例(注意没有了Loading .env environment variables…信息):
1 | > $env:PIPENV_DONT_LOAD_ENV=1 |
方案四:使用.flaskenv
pipenv shell不会从.flaskenv加载变量,所以如果有经常需要修改的环境变量也可以放在.flaskenv。但是我感觉一点也不优雅,因为我习惯把.flaskenv也提交到仓库,而留下.env在部署端客制化。