AI智能
改变未来

Django settings


Django 配置文件

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

    来使用配置文件

settings源码分析

用户配置,就使用用户配置的,没配置就使用默认配置的Django内部源码如何实现如下:

1、导入from django.conf import settings2、源码内部settings = LazySettings()os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") # manage.pyENVIRONMENT_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配置基本都是采用“插拔式”的方式,来完成使用字符串就可以完成大部分的功能配置;

importlib 导入

👉[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  importlibres = \'mod.b\'ret = importlib.import_module(res)print(ret)   # <module \'mod.b\' from \'E:\\\\djangoSet\\\\mod\\\\b.py\'>from mod import bprint(b)   # <module \'mod.b\' from \'E:\\\\djangoSet\\\\mod\\\\b.py\'># importlib相当于传入字符串,帮助导入,这两种绝对导入的结果是一样的
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Django settings