zoukankan      html  css  js  c++  java
  • python-dotenv 管理项目中的环境变量

    PyPi:https://pypi.org/project/python-dotenv/

    介绍

    Reads the key-value pair from .env file and adds them to environment variable. It is great for managing app settings during development and in production using 12-factor principles.
    Do one thing, do it well!

    安装

    pip install -U python-dotenv
    

    基本用法

    The easiest and most common usage consists on calling load_dotenv when the application starts, which will load environment variables from a file named .env in the current directory or any of its parents or from the path specificied; after that, you can just call the environment-related method you need as provided by os.getenv.

    .env文件内容类似:

    # a comment that will be ignored.
    REDIS_ADDRESS=localhost:6379
    MEANING_OF_LIFE=42
    MULTILINE_VAR="hello
    world"
    
    CONFIG_PATH=${HOME}/.config/foo
    DOMAIN=example.org
    EMAIL=admin@${DOMAIN}
    DEBUG=${DEBUG:-false}
    

    在设置文件里加载

    # settings.py
    from dotenv import load_dotenv
    load_dotenv()
    
    # OR, the same with increased verbosity
    load_dotenv(verbose=True)
    
    # OR, explicitly providing path to '.env'
    from pathlib import Path  # Python 3.6+ only
    env_path = Path('.') / '.env'
    load_dotenv(dotenv_path=env_path)
    

    读取示例

    # settings.py
    import os
    SECRET_KEY = os.getenv("EMAIL")
    DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD")
    

    坑一:默认不会更新的配置项

    from dotenv import load_dotenv, find_dotenv
    load_dotenv(find_dotenv())
    

    然而这个例子里面缺隐藏了一个大坑。此时当用户在.env中更新配置项的值时,是不会生效的。原因是load_dotenv默认不会更新已经存在的配置项。推荐使用override参数,推荐代码如下:

    from dotenv import load_dotenv, find_dotenv
    load_dotenv(find_dotenv(), override=True)
    

    #的处理

    考虑.env中的如下写法:

    BASEURL=http://codehub.com/#/python
    

    暂且不讨论在url中带#是否优雅。#在url中表示锚点,的确是会经常用到的;然而在Python中却是表示注释开始。此时BASEURL的值会是http://codehub.com/。以下写法均符合预期。

    BASEURL="http://codehub.com/#/python"
    BASEURL='http://codehub.com/#/python'
    

    需要使用双引号/单引号括起来。

    Flask 中的实践

    一般来说,在执行flask run命令运行程序前,我们需要提供程序实例所在模块的位置 。

    Flask会自动探测程序实例,自动探测存在下面这些规则:

    从当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例
    从环境变量FLASK_APP对应的值寻找名为app或application的程序实例

    如果你程序主模块命名为app.py,flask run命令会自动在其中寻找程序实例。如果你的程序主模块名是其他名称,

    比如hello.py,那么需要设置环境变量FLASK_APP,将包含程序实例的模块名赋值给这个变量。

    在linux 或 macOS系统使用export命令: export FLASK_APP=hello

    除了FLASK_APP,我们还需要使用到其他环境变量。环境变量在新创建命令行窗口或重启电脑后就清除了,每次都要重设

    变量有些麻烦。而且如果你同时开发多个Flask程序,这个FLASK_APP就需要在不同的值之间切换。为了避免频繁设置环境变量,

    我们在项目根目录下分别创建两个文件:.env和.flaskenv。.flaskenv用来存储和Flask相关的公开环境变量,比如FLASK_APP;

    而.env用来存储包含敏感信息的环境变量,比如配置Email服务器的账户名与密码。

    在.env和.flaskenv文件中,环境变量使用键值对的形式定义,每行一个,以#开头的为注释

    【注意!】一定是要在运行flask项目的情况下.env 和.flaskenv中的环境变量才会被Flask加载

    如果不在.flaskenv中配置有关flask的环境变量,运行flask后,
    即使.flaskenv中有其它变量如,TEST_ENV,也不能获取到它的值

    .flaskenv 文件中增加环境变量 FLASK_ENV='development' 再次运行app.py

    这次.flaskenv中的环境变量都被Flask加载到了,与Flask环境无关的变量TEST_ENV的值也能被获取取了

    另:如果不使用python-dotenv来管理配置变量,其实也可以使用.ini这样的配置文件来存储配置信息。

    更多内容见 pypi

  • 相关阅读:
    iOS利用通知(NSNotification)进行传值
    yum gd linux
    discuz搬家
    快速上传到rackspace cdn工具turbolift swift 安装
    linux 文件属性、权限、所有人、所属组
    Tar压缩文件
    lamp安装手稿
    Mysql导出导入相关操作记录
    How to Install a Language Pack
    centos下开启htaccess
  • 原文地址:https://www.cnblogs.com/wbyixx/p/13444500.html
Copyright © 2011-2022 走看看