Django settings源码分析和importlib导入机制是什么都在这里👆
Django其实有两个配置文件,一个是创建项目的时候,暴露给用户使用的settings.py
,另外一个是项目默认的配置文件,需要导入查看from django.conf import global_settings
当用户不做任何配置的时候,会加载使用默认的配置文件,就是指定了自己的配置,使用自己配置的,没有配置使用默认的配置;
# 就比如settings.py设置的语言是英语
LANGUAGE_CODE = 'en-us'
# 我们也可以通过查看global_settings源码查看语言种类来修改
LANGUAGE_CODE = 'zh-hans'
注意
from djangoitem1 import settings
from django.conf import settings
来使用配置文件用户配置,就使用用户配置的,没配置就使用默认配置的Django内部源码如何实现如下:
1、导入
from django.conf import settings
2、源码内部
settings = LazySettings()
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") # manage.py
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
class LazySettings(LazyObject):
def _setup(self, name=None):
# os.environ看成是一个全局大字典 'mysite.settings'
settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
self._wrapped = Settings(settings_module) # Settings('mysite.settings')
class Settings(object):
def __init__(self, settings_module): # 'mysite.settings'
for setting in dir(global_settings): # 获取全局配置文件里面所有的变量名
if setting.isupper(): # 校验是否是纯大写
setattr(self, setting, getattr(global_settings, setting))
# 给Settings对象添加全局配置文件中所有的配置信息
self.SETTINGS_MODULE = settings_module # 'mysite.settings'
mod = importlib.import_module(self.SETTINGS_MODULE)
# from mysite import settings # 导入暴露给用户的自定义配置文件
for setting in dir(mod):
if setting.isupper():
setting_value = getattr(mod, setting)
setattr(self, setting, setting_value)
ps:Django配置基本都是采用“插拔式”的方式,来完成使用字符串就可以完成大部分的功能配置;
👉[python 3标准库示例](20.2. importlib — Python 的模块载入机制 | 模块和扩展 |《Python 3 标准库实例教程》| Python 技术论坛 (learnku.com))
👉[importlib](python3导入模块 —— importlib - 知乎 (zhihu.com))
importlib
中的高级 API 使得在给定绝对或相对名称的情况下导入模块变得简单。 使用相对模块名称时,将包含模块的包指定为单独的参数;importlib.import_module(name, package=None)
name: 1、绝对路径导入,例如name=文件夹/包.文件(模块)
2、相对路径导入,例如name='.文件夹',此时需要定义package参数,package='文件夹'
import importlib
res = 'mod.b'
ret = importlib.import_module(res)
print(ret) # <module 'mod.b' from 'E:\\djangoSet\\mod\\b.py'>
from mod import b
print(b) # <module 'mod.b' from 'E:\\djangoSet\\mod\\b.py'>
# importlib相当于传入字符串,帮助导入,这两种绝对导入的结果是一样的
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.cnblogs.com/48xz/p/15951360.html
内容来源于网络,如有侵权,请联系作者删除!