{"id":131863,"date":"2020-07-05T21:02:30","date_gmt":"2020-07-05T13:02:30","guid":{"rendered":"http:\/\/4563.org\/?p=131863"},"modified":"2020-07-05T21:02:30","modified_gmt":"2020-07-05T13:02:30","slug":"django-%e9%a1%b9%e7%9b%ae%e5%a6%82%e4%bd%95%e9%80%9a%e8%bf%87%e5%8a%a0%e8%bd%bd%e4%b8%8d%e5%90%8cenv%e6%96%87%e4%bb%b6%e6%9d%a5%e5%8c%ba%e5%88%86%e4%b8%8d%e5%90%8c%e7%8e%af%e5%a2%83","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=131863","title":{"rendered":"Django \u9879\u76ee\u5982\u4f55\u901a\u8fc7\u52a0\u8f7d\u4e0d\u540cenv\u6587\u4ef6\u6765\u533a\u5206\u4e0d\u540c\u73af\u5883"},"content":{"rendered":"<p>\u672c\u6587\u4e3b\u8981\u662f\u6574\u7406\u5982\u4f55\u5728 django  \u9879\u76ee\u4e2d\u89e3\u51b3\u4e0d\u540c\u73af\u5883\u4e0b\u52a0\u8f7d\u4e0d\u540c .env  \u73af\u5883\u914d\u7f6e\u6587\u4ef6\u7684\u65b9\u6848\u3002\u4e3b\u8981\u5185\u5bb9\u5305\u542b django-environ  \u7684\u5b89\u88c5\u4f7f\u7528\uff0c\u4ee5\u53ca django-crontab \u811a\u672c\u73af\u5883\u4e0b\u7684\u914d\u7f6e\u4f7f\u7528\u3002<\/p>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#django-environ-\u7684\u4f7f\u7528\" title=\"django-environ \u7684\u4f7f\u7528\"><\/a>django-environ \u7684\u4f7f\u7528<\/h3>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u5b89\u88c5\" title=\"\u5b89\u88c5\"><\/a>\u5b89\u88c5<\/h4>\n<p><a href=\"https:\/\/django-environ.readthedocs.io\/en\/latest\/\">\u5b98\u65b9 django-environ  github\u94fe\u63a5\u5730\u5740<\/a><\/p>\n<p><code>pip install django-environ<\/code><\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u4f7f\u7528\" title=\"\u4f7f\u7528\"><\/a>\u4f7f\u7528<\/h4>\n<ul>\n<li>\u521b\u5efa .env\u6587\u4ef6<\/li>\n<\/ul>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><span>5<\/span><br><span>6<\/span><br><span>7<\/span><br><span>8<\/span><br><span>9<\/span><br><span>10<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span># \u9879\u76ee\u76ee\u5f55\u4e2d<\/span><br><span>touch .env<\/span><br><span><\/span><br><span># \u589e\u52a0\u73af\u5883\u53d8\u91cf<\/span><br><span>DEBUG&#x3D;True<\/span><br><span>SECRET_KEY&#x3D;your-secret-key<\/span><br><span>DATABASE_URL&#x3D;psql:&#x2F;&#x2F;urser:un-githubbedpassword@127.0.0.1:8458&#x2F;database<\/span><br><span>SQLITE_URL&#x3D;sqlite:&#x2F;&#x2F;&#x2F;my-local-sqlite.db<\/span><br><span>CACHE_URL&#x3D;memcache:&#x2F;&#x2F;127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213<\/span><br><span>REDIS_URL&#x3D;rediscache:&#x2F;&#x2F;127.0.0.1:6379&#x2F;1?client_class&#x3D;django_redis.client.DefaultClient&amp;password&#x3D;ungithubbed-secret<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<ul>\n<li>\u4e0e<code>settings.py<\/code>\u4e00\u8d77\u4f7f\u7528\u3002\u4e3a\u4e86\u65b9\u4fbf\u4f7f\u7528\u76ee\u524d\u4f7f\u7528gitlab\u4e3a\u5185\u7f51\u73af\u5883\uff0c\u6545\u800c<code>.env<\/code>\u4e0d\u9700\u8981\u52a0\u5165<code>.gitignore<\/code>\uff0c\u5b9e\u73b0\u6587\u4ef6\u5ffd\u7565\u4e0a\u4f20\u3002<\/li>\n<\/ul>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><span>5<\/span><br><span>6<\/span><br><span>7<\/span><br><span>8<\/span><br><span>9<\/span><br><span>10<\/span><br><span>11<\/span><br><span>12<\/span><br><span>13<\/span><br><span>14<\/span><br><span>15<\/span><br><span>16<\/span><br><span>17<\/span><br><span>18<\/span><br><span>19<\/span><br><span>20<\/span><br><span>21<\/span><br><span>22<\/span><br><span>23<\/span><br><span>24<\/span><br><span>25<\/span><br><span>26<\/span><br><span>27<\/span><br><span>28<\/span><br><span>29<\/span><br><span>30<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span>import environ<\/span><br><span><\/span><br><span># initialize env<\/span><br><span>env &#x3D; environ.Env(<\/span><br><span>    # set casting, default value<\/span><br><span>    DEBUG&#x3D;(bool, False)<\/span><br><span>)<\/span><br><span># reading .env file<\/span><br><span>environ.Env.read_env()<\/span><br><span><\/span><br><span># False if not in os.environ<\/span><br><span>DEBUG &#x3D; env(&#39;DEBUG&#39;)<\/span><br><span><\/span><br><span># Raises django&#39;s ImproperlyConfigured exception if SECRET_KEY not in os.environ<\/span><br><span>SECRET_KEY &#x3D; env(&#39;SECRET_KEY&#39;)<\/span><br><span><\/span><br><span># Parse database connection url strings like psql:&#x2F;&#x2F;user:pass@127.0.0.1:8458&#x2F;db<\/span><br><span>DATABASES &#x3D; &#123;<\/span><br><span>    # read os.environ[&#39;DATABASE_URL&#39;] and raises ImproperlyConfigured exception if not found<\/span><br><span>    &#39;default&#39;: env.db(),<\/span><br><span>    # read os.environ[&#39;SQLITE_URL&#39;]<\/span><br><span>    &#39;extra&#39;: env.db(&#39;SQLITE_URL&#39;, default&#x3D;&#39;sqlite:&#x2F;&#x2F;&#x2F;&#x2F;tmp&#x2F;my-tmp-sqlite.db&#39;)<\/span><br><span>&#125;<\/span><br><span><\/span><br><span>CACHES &#x3D; &#123;<\/span><br><span>    # read os.environ[&#39;CACHE_URL&#39;] and raises ImproperlyConfigured exception if not found<\/span><br><span>    &#39;default&#39;: env.cache(),<\/span><br><span>    # read os.environ[&#39;REDIS_URL&#39;]<\/span><br><span>    &#39;redis&#39;: env.cache(&#39;REDIS_URL&#39;)<\/span><br><span>&#125;<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#\u5982\u4f55\u5b9e\u73b0\u4e0d\u540c\u73af\u5883\u4e0b\u52a0\u8f7d\u4e0d\u540c\u73af\u5883\u53d8\u91cf\" title=\"\u5982\u4f55\u5b9e\u73b0\u4e0d\u540c\u73af\u5883\u4e0b\u52a0\u8f7d\u4e0d\u540c\u73af\u5883\u53d8\u91cf\"><\/a>\u5982\u4f55\u5b9e\u73b0\u4e0d\u540c\u73af\u5883\u4e0b\u52a0\u8f7d\u4e0d\u540c\u73af\u5883\u53d8\u91cf<\/h3>\n<p>\u5728\u53ea\u4f7f\u7528\u4e00\u4e2a settings.py \u6587\u4ef6\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u53ea\u4f7f\u7528\u4e00\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u901a\u8fc7\u6b64\u73af\u5883\u53d8\u91cf\u6765\u8bfb\u53d6\u4e0d\u540c\u73af\u5883\u7684 .env \u6587\u4ef6\u4ee5\u533a\u5206\u4e0d\u540c\u73af\u5883\u3002<br \/>\u8fd9\u4e2a\u73af\u5883\u53d8\u91cf\u5c31\u6ca1\u6cd5\u5199\u5728 .env \u6587\u4ef6\u4e86\uff0c\u5fc5\u987b\u624b\u52a8\u6307\u5b9a\u3002\u5047\u8bbe\u6211\u4eec\u8fd9\u4e2a\u73af\u5883\u53d8\u91cf\u53ebPROJECT_ENV\u3002\u90a3\u4e48\u6211\u4eec\u5728\u547d\u4ee4\u884c\u6267\u884c\u4efb\u4f55\u547d\u4ee4\u7684\u65f6\u5019\uff0c\u5728\u524d\u9762\u52a0\u4e0aPROJECT_ENV=xxx\u6765\u6307\u5b9a\u73af\u5883\u53d8\u91cf\u3002<br \/>\u5f53\u7136\uff0c\u4e5f\u53ef\u4ee5export\u6765\u6307\u5b9a\u8fd9\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u4e5f\u53ef\u4ee5\u4fee\u6539shell\u914d\u7f6e\u6587\u4ef6\u6765\u6307\u5b9a\u8fd9\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u751a\u81f3supervisord\u548cuwsgi\u7684\u914d\u7f6e\u6587\u4ef6\u4e5f\u53ef\u4ee5\u6307\u5b9a\u73af\u5883\u53d8\u91cf\u3002<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u6267\u884c\u65b9\u6cd5\" title=\"\u6267\u884c\u65b9\u6cd5\"><\/a>\u6267\u884c\u65b9\u6cd5<\/h4>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span>PROJECT_ENV&#x3D;local python manage.py runserver<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u591a\u73af\u5883-env\u6587\u4ef6\u8bbe\u7f6e\" title=\"\u591a\u73af\u5883.env\u6587\u4ef6\u8bbe\u7f6e\"><\/a>\u591a\u73af\u5883.env\u6587\u4ef6\u8bbe\u7f6e<\/h4>\n<p>\u5047\u8bbe\u76ee\u524d\u5b58\u5728 local \u4ee5\u53ca product \u4e24\u79cd\u73af\u5883\uff0c\u5219\u5728 envs \u4e0b\u65b0\u5efa .env.local \u4ee5\u53ca .env.product \u6587\u4ef6\u3002<\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#settings-py-\u4ee3\u7801\u517c\u5bb9\" title=\"settings.py \u4ee3\u7801\u517c\u5bb9\"><\/a>settings.py \u4ee3\u7801\u517c\u5bb9<\/h4>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><span>5<\/span><br><span>6<\/span><br><span>7<\/span><br><span>8<\/span><br><span>9<\/span><br><span>10<\/span><br><span>11<\/span><br><span>12<\/span><br><span>13<\/span><br><span>14<\/span><br><span>15<\/span><br><span>16<\/span><br><span>17<\/span><br><span>18<\/span><br><span>19<\/span><br><span>20<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span>import os<\/span><br><span>import environ<\/span><br><span>import logging.config<\/span><br><span><\/span><br><span># Build paths inside the project like this: os.path.join(BASE_DIR, ...)<\/span><br><span>BASE_DIR &#x3D; os.path.dirname(os.path.dirname(os.path.abspath(__file__)))<\/span><br><span><\/span><br><span>env &#x3D; environ.Env(<\/span><br><span>    # set casting, default value<\/span><br><span>    DEBUG&#x3D;(bool, False)<\/span><br><span>)<\/span><br><span><\/span><br><span>&quot;&quot;&quot;<\/span><br><span>\u901a\u8fc7\u6307\u5b9a\u73af\u5883\u904d\u5386\u52a0\u8f7d\u4e0d\u540cenv\u6587\u4ef6<\/span><br><span>PROJECT_ENV&#x3D;production python manage.py crontab add<\/span><br><span>\u9ed8\u8ba4\u573a\u666f\u4e0b\u53ef\u4e0d\u6307\u5b9a\uff0c\u5219\u52a0\u8f7dlocal\u6587\u4ef6<\/span><br><span>&quot;&quot;&quot;<\/span><br><span>env_name &#x3D; env.str(&#39;PROJECT_ENV&#39;, &#39;local&#39;)<\/span><br><span># reading .env file<\/span><br><span>env.read_env(&#39;envs&#x2F;.env.%s&#39; % env_name)<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h3><a href=\"https:\/\/www.studytime.xin\/article\/#\u5982\u4f55\u5728-django-crontab-\u811a\u672c\u73af\u5883\u4e0b\u52a0\u8f7d\u4e0d\u540c\u914d\u7f6e\" title=\"\u5982\u4f55\u5728 django-crontab \u811a\u672c\u73af\u5883\u4e0b\u52a0\u8f7d\u4e0d\u540c\u914d\u7f6e\"><\/a>\u5982\u4f55\u5728 django-crontab \u811a\u672c\u73af\u5883\u4e0b\u52a0\u8f7d\u4e0d\u540c\u914d\u7f6e<\/h3>\n<p>django-crontab \u7684\u4f7f\u7528\u53ef\u4ee5\u53c2\u8003 <a href=\"https:\/\/www.studytime.xin\/python\/2020\/02\/11\/python-django-crontab.html\">django-crontab\u5b9e\u73b0\u670d\u52a1\u7aef\u7684\u5b9a\u65f6\u4efb\u52a1<\/a><\/p>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u4ee3\u7801\u8c03\u6574\" title=\"\u4ee3\u7801\u8c03\u6574\"><\/a>\u4ee3\u7801\u8c03\u6574<\/h4>\n<p>\u5728 settings.py \u6587\u4ef6\u4e2d\uff0cdjango-crontab \u914d\u7f6e\u4efb\u52a1 CRONJOBS \u4e0b\u589e\u52a0<br \/><code>CRONTAB_COMMAND_PREFIX = &#39;PROJECT_ENV=&#39; + env_name<\/code> \u53c2\u6570\u6307\u5b9a<\/p>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><span>2<\/span><br><span>3<\/span><br><span>4<\/span><br><span>5<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span>CRONJOBS &#x3D; [<\/span><br><span>    (&quot;*&#x2F;5 * * * *&quot;, &quot;analysis.cron.test_cron&quot;, &quot;&gt;&gt;&quot; + LOG_DIR + &quot;log&#x2F;fba_claim_shipment.log&quot;),<\/span><br><span>]<\/span><br><span><\/span><br><span>CRONTAB_COMMAND_PREFIX &#x3D; &#39;PROJECT_ENV&#x3D;&#39; + env_name<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n<h4><a href=\"https:\/\/www.studytime.xin\/article\/#\u6267\u884c\u65b9\u6cd5-1\" title=\"\u6267\u884c\u65b9\u6cd5\"><\/a>\u6267\u884c\u65b9\u6cd5<\/h4>\n<figure>\n<table>\n<tr>\n<td>\n<pre><span>1<\/span><br><\/pre>\n<\/td>\n<td>\n<pre><span>PROJECT_ENV&#x3D;local python manage.py crontab add<\/span><br><\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u4e3b\u8981\u662f\u6574\u7406\u5982\u4f55\u5728 django&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/131863"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=131863"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/131863\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=131863"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=131863"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=131863"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}