本文用到的方法来源于:github.com/wemake-serv…
生产环境和开发环境一般会有两套不同的配置,比如域名、数据库等。同时开发环境可能还会用到debug_toolbar
等工具,这个是没必要在线上使用的。 最好是能够用一套代码同时支持线上和开发两个环境。
实现的方法有很多,各有所爱,我介绍一下我的。
配置信息单独放文件
我会将所有的配置信息放到一个单独的配置文件,用到的包为:github.com/henriquebas…,使用很简单:
首先在根目录下建一个config 目录:
有两个文件:.env
和.env.template
,.env
包含的是真正的配置信息,线上和开发环境内容不同,这个文件不要提交到版本管理工具。.env.template
是模板文件,列出需要填的那些配置,提交到版本管理工具,如下图:
然后在settings.py
里面导入这些配置:(BASE_DIR 和 config 目录的位置应项目而异)
from pathlib import PurePath
from decouple import AutoConfig
BASE_DIR = PurePath(__file__).parent.parent
config = AutoConfig(search_path=BASE_DIR.joinpath('config'))
复制代码
然后通过config('ENV_NAME')
获取相应配置,比如数据库的配置就可以这样写:
根据线上线下环境,动态加载配置
用到了第三方模块:django-split-settings
一个示例的settings
如下:
settings/__init__.py
的内容:
from os import environ
from split_settings.tools import optional, include
# Managing environment via DJANGO_ENV variable:
environ.setdefault('DJANGO_ENV', 'development')
ENV = environ['DJANGO_ENV']
base_settings = [
'components/common.py',
'components/logging.py',
'components/csp.py',
'components/caches.py',
# You can even use glob:
# 'components/*.py'
# Select the right env:
'environments/{0}.py'.format(ENV),
# Optionally override some settings:
optional('environments/local.py'),
]
# Include settings:
include(*base_settings)
复制代码
这里用一个环境变量DJANGO_ENV
来区分开发环境(development)或者线上环境(production)。如果是开发环境,就会加载environments/development.py
;如果是线上环境,就会加载environments/production.py
。
在environments/development.py
里面,可以对配置信息做下面这种修改:
- 把
localhost
添加到ALLOWED_HOSTS
- 把
debug_toolbar
添加到INSTALLED_APPS
- 新增两个中间件
ALLOWED_HOSTS += [
'localhost',
'0.0.0.0',
'127.0.0.1',
'[::1]',
]
INSTALLED_APPS += (
'debug_toolbar',
'nplusone.ext.django',
)
MIDDLEWARE += (
'debug_toolbar.middleware.DebugToolbarMiddleware',
# https://github.com/bradmontgomery/django-querycount
# Prints how many queries were executed, useful for the APIs.
'querycount.middleware.QueryCountMiddleware',
)
复制代码
然后部署的时候,可以在docker-compose.yaml
中指定args DJANGO_ENV
为prodution
:
如果你像我一样真正热爱计算机科学,喜欢研究底层逻辑,欢迎关注我的微信公众号: