Django分环境拆分settings时test.py无法识别BASE_DIR变量报错
报错原因
触发NameError: name 'BASE_DIR' is not defined是Python模块导入的作用域规则导致的:
settings/__init__.py中执行的from .base import *,仅会把base.py内的变量导入到__init__.py自身的模块命名空间- 执行
from .test import *加载测试配置时,test.py作为独立模块运行,自身全局作用域内没有BASE_DIR定义,也无法访问__init__.py命名空间内的变量,因此抛出未定义错误。
修复方案
遵循Python「显式优于隐式」的原则,直接在各环境配置文件中显式导入基础配置即可,不存在额外的作用域隐患,步骤如下:
- 修改环境配置文件
settings/test.py,在文件开头导入base模块的全部公共内容,后续即可直接使用BASE_DIR等base中定义的变量:
# settings/test.py from .base import * # 测试环境自定义配置 DATA_VOLUME_BASE_DIR = BASE_DIR / 'scanned_images' # 其余测试环境配置(DEBUG、数据库、缓存等)正常往下编写即可
生产环境、开发环境的配置文件(prod.py/dev.py)也按同样规则,开头加from .base import *即可。
- 调整
settings/__init__.py的逻辑,去掉冗余的base导入,同时优化环境变量读取逻辑,避免未设置ENV变量时触发KeyError:
# settings/__init__.py import os # 读取系统环境变量,没设置ENV时默认加载开发环境配置 env = os.getenv("ENV", "dev") if env == "test": from .test import * elif env == "prod": from .prod import * else: from .dev import *
不推荐通过修改导入逻辑把
__init__.py的变量强行注入到环境配置模块的写法,隐式传递变量会提升后续维护的排查成本,显式导入的写法可读性和兼容性最好,不会出现作用域相关的异常问题。
内容的提问来源于stack exchange,提问作者ron_g
相关产品推荐
相关产品推荐

