![深入理解Django:框架内幕与实现原理](https://wfqqreader-1252317822.image.myqcloud.com/cover/14/43738014/b_43738014.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.1.1 Settings类
Settings类的定义如下:
![](https://epubservercos.yuewen.com/7EA2B2/23020638109733406/epubprivate/OEBPS/Images/42188_106_1.jpg?sign=1739256109-FpeoOpKqsW7NxfsKzSn5aWRdJ10bDFXl-0-03570c245af4a1dd9a7da0bed409b5d7)
![](https://epubservercos.yuewen.com/7EA2B2/23020638109733406/epubprivate/OEBPS/Images/42188_107_1.jpg?sign=1739256109-Lq94x9RMtDgctYGQiswtBGkB0xF94VeJ-0-637b01f2d2f8046fb397ab666f2acddf)
从Settings类中可以直接得到第2个问题的答案。在该类的初始化方法中,先在全局的配置模块(global_settings模块)中遍历大写的属性及其值并添加到该Settings对象中。这里用到了dir()和setattr()这两个非常常见且十分重要的函数,前者表示获取模块的属性,后者表示给对象设置属性及属性值。这样Settings对象就具备了global_settings模块中的属性,并且其值和global_settings模块中的相同。之后再导入传入的settings_module模块,按同样的方式设置该Settings对象的属性。如果settings_module模块和global_settings模块中的属性有交叉,则以settings_module模块的为准(因为是后设置的)。接着是一些必须要设置的属性值,比如SECRET_KEY值等。如果不在settings_module模块中设置,即默认为空字符串,则会直接抛出异常。下面看一下该类的一个使用示例,代码如下:
![](https://epubservercos.yuewen.com/7EA2B2/23020638109733406/epubprivate/OEBPS/Images/42188_107_2.jpg?sign=1739256109-DqlbkLbrV6OkmvpOYV1lMEGR4rZJi33F-0-cd0f8afff2a08fc1eab48b450cc48b85)
![](https://epubservercos.yuewen.com/7EA2B2/23020638109733406/epubprivate/OEBPS/Images/42188_108_1.jpg?sign=1739256109-EnNjJFgbgT76yvAWFk3nsmGl2Ojx8l8p-0-b2ebcd5efc5dc4a1587b22110ab23677)
上面的示例演示了在配置文件中定义的三个变量值:DEBUG、SECRET_KEY和FILE_UPLOAD_MAX_MEMORY_SIZE。其中,前两个变量在first_django.settings模块中已定义,而第三个变量没有在first_django.settings模块中定义。因此,最终得到的Settings对象的前两个属性值为first_django.settings模块中定义的变量值,而第三个属性值为django.conf.global_settings模块中定义的变量值。