django-environ with Lists Environment Varibles in .env Files

Issue

django-environ is the Python package that allows you to use Twelve-factor methodology to configure your Django application with environment variables.

It is very usefull package although there are some missing things in the documentation like how we use list as an environment variable?

They got doc for nested list but not for normal/raw list.

One of the main case for using list would be ALLOWED_HOSTS.

Let’s assume we have hosts in our settings.py:

<span># settings.py </span><span>...</span>
<span>ALLOWED_HOSTS</span> <span>=</span> <span>[</span>
<span>"example.com"</span><span>,</span>
<span>"awesomedomain.com"</span><span>,</span>
<span>"stagingdomain.com"</span><span>,</span>
<span>"10.0.0.2"</span><span>,</span>
<span>"198.162.44.72"</span><span>,</span>
<span>]</span>
<span># settings.py </span><span>...</span>

<span>ALLOWED_HOSTS</span> <span>=</span> <span>[</span>
    <span>"example.com"</span><span>,</span>
    <span>"awesomedomain.com"</span><span>,</span>
    <span>"stagingdomain.com"</span><span>,</span>
    <span>"10.0.0.2"</span><span>,</span>
    <span>"198.162.44.72"</span><span>,</span>
<span>]</span>
# settings.py ... ALLOWED_HOSTS = [ "example.com", "awesomedomain.com", "stagingdomain.com", "10.0.0.2", "198.162.44.72", ]

Enter fullscreen mode Exit fullscreen mode

How can we move this hardcoded list/array to an .env file and use it with django-environ?

Solution

First add env.list to your settings:

<span># settings.py </span><span>ALLOWED_HOSTS</span> <span>=</span> <span>env</span><span>.</span><span>list</span><span>(</span><span>"ALLOWED_HOSTS"</span><span>)</span>
<span># settings.py </span><span>ALLOWED_HOSTS</span> <span>=</span> <span>env</span><span>.</span><span>list</span><span>(</span><span>"ALLOWED_HOSTS"</span><span>)</span>
# settings.py ALLOWED_HOSTS = env.list("ALLOWED_HOSTS")

Enter fullscreen mode Exit fullscreen mode

Then add your hosts with comma separated into .env which located in the root of your project or a proper location;

# .env
...
ALLOWED_HOSTS=example.com,awesomedomain.com,stagingdomain.com,10.0.0.2,198.162.44.72
# .env
...

ALLOWED_HOSTS=example.com,awesomedomain.com,stagingdomain.com,10.0.0.2,198.162.44.72
# .env ... ALLOWED_HOSTS=example.com,awesomedomain.com,stagingdomain.com,10.0.0.2,198.162.44.72

Enter fullscreen mode Exit fullscreen mode

Extra

Your environment variables file —.env, can be anything and anywhere —.envs/.local, .env.prod, as long as you configure it properly in your settings:

<span># settings.py </span><span>import</span> <span>os</span>
<span>import</span> <span>environ</span>
<span># Set the project base directory </span><span>BASE_DIR</span> <span>=</span> <span>os</span><span>.</span><span>path</span><span>.</span><span>dirname</span><span>(</span><span>os</span><span>.</span><span>path</span><span>.</span><span>dirname</span><span>(</span><span>os</span><span>.</span><span>path</span><span>.</span><span>abspath</span><span>(</span><span>__file__</span><span>)))</span>
<span># Initiate related env class </span><span>env</span> <span>=</span> <span>environ</span><span>.</span><span>Env</span><span>()</span>
<span># Take environment variables from .env.dev file </span><span>environ</span><span>.</span><span>Env</span><span>.</span><span>read_env</span><span>(</span><span>os</span><span>.</span><span>path</span><span>.</span><span>join</span><span>(</span><span>BASE_DIR</span><span>,</span> <span>'.env.dev'</span><span>)</span>
<span>...</span>
<span># settings.py </span><span>import</span> <span>os</span>

<span>import</span> <span>environ</span>

<span># Set the project base directory </span><span>BASE_DIR</span> <span>=</span> <span>os</span><span>.</span><span>path</span><span>.</span><span>dirname</span><span>(</span><span>os</span><span>.</span><span>path</span><span>.</span><span>dirname</span><span>(</span><span>os</span><span>.</span><span>path</span><span>.</span><span>abspath</span><span>(</span><span>__file__</span><span>)))</span>

<span># Initiate related env class </span><span>env</span> <span>=</span> <span>environ</span><span>.</span><span>Env</span><span>()</span>
<span># Take environment variables from .env.dev file </span><span>environ</span><span>.</span><span>Env</span><span>.</span><span>read_env</span><span>(</span><span>os</span><span>.</span><span>path</span><span>.</span><span>join</span><span>(</span><span>BASE_DIR</span><span>,</span> <span>'.env.dev'</span><span>)</span>

<span>...</span>
# settings.py import os import environ # Set the project base directory BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Initiate related env class env = environ.Env() # Take environment variables from .env.dev file environ.Env.read_env(os.path.join(BASE_DIR, '.env.dev') ...

Enter fullscreen mode Exit fullscreen mode

All done!

原文链接:django-environ with Lists Environment Varibles in .env Files

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
pencil and a dream can take you anywhere.
拿起笔,写下你的梦想,你的人生就从此刻起航
评论 抢沙发

请登录后发表评论

    暂无评论内容