我是如何管理 django 线上线下两套环境的

鲍国兴
2023-12-01

本文用到的方法来源于: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_ENVprodution

如果你像我一样真正热爱计算机科学,喜欢研究底层逻辑,欢迎关注我的微信公众号:

 类似资料: