Django settings配置namedtuple变量报Settings无SCHEMA_VERSION错误如何解决?
问题原因及解决方法
1 首要问题:配置未被Django加载导致属性不存在
你遇到的AttributeError: 'Settings' object has no attribute 'SCHEMA_VERSION'报错,首先是因为Django没有加载到你定义的SCHEMA_VERSION变量,排查方向:
- 确认你将
SCHEMA_VERSION的定义写在了Django加载的配置文件(通常是项目根目录下的settings.py)中,Django的django.conf.settings只会加载DJANGO_SETTINGS_MODULE环境变量指向的模块的顶层变量,如果你写在其他独立py文件中,不会自动同步到settings对象里。 - 确认运行Django时没有通过
--settings参数指定其他配置文件,覆盖了包含SCHEMA_VERSION定义的默认配置。
2 核心逻辑错误:decouple config用法不符合需求
你现在的用法完全混淆了decouple.config的作用:config()函数的作用是从环境变量、.env文件中读取配置值,而你需要放到settings里的SCHEMA_VERSION是namedtuple类本身(用来后续实例化对象),不需要从环境变量读取,用config()包裹属于逻辑错误。
你现有代码的运行逻辑是:
从环境变量查找
SCHEMA_VERSION值,找不到就返回你设置的default=None,最终settings.SCHEMA_VERSION会变成None,就算属性存在,后续调用settings.SCHEMA_VERSION(**result)也会报错,因为None不是可调用对象。
正确写法
直接在settings.py中定义namedtuple类即可:
from collections import namedtuple SCHEMA_VERSION = namedtuple( typename="SCHEMA_VERSION", field_names=["subject", "schema_id", "version"], defaults=[None, None, None] )
如果你确实需要从环境变量读取默认的SCHEMA_VERSION实例,可以分开定义:
from collections import namedtuple from decouple import config # 先定义要暴露给settings的namedtuple类 SCHEMA_VERSION = namedtuple( typename="SCHEMA_VERSION", field_names=["subject", "schema_id", "version"], defaults=[None, None, None] ) # 单独配置从环境变量读取的默认实例 DEFAULT_SCHEMA_VERSION = config( "SCHEMA_VERSION", cast=lambda v: SCHEMA_VERSION(*v.split(",")), default=None )
3 其他代码笔误修正
你在RedisService类中多次把变量arn错写为ran,需要修正,否则会触发NameError报错。
内容的提问来源于stack exchange,提问作者Maciej Krzanowski
相关产品推荐
相关产品推荐

