django之配置文件加载

指定配置文件

django通过DJANGO_SETTINGS_MODULE环境变量指定要加载的配置文件。

通过startproject命令新建项目后,在生成的manage.py文件中,即自动设置了DJANGO_SETTINGS_MODULE变量值为项目下的settings文件。

python 复制代码
# 新建项目
django-admin startproject myproject


# manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

可以通过修改DJANGO_SETTINGS_MODULE指定配置文件。如下

python 复制代码
# manange.py文件中
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myconf.settings')

在代码中使用配置

在代码中使用配置,通过如下方式引入

python 复制代码
from django.conf import settings


if settings.DEBUG:
   # Do something

注意 django.conf.settings 并不是一个模块!-- 而是一个对象!所以引入某个单独的设置项是不对的。

python 复制代码
from django.conf.settings import DEBUG  # This won't work.

lazyObject解析

配置文件加载的代码位于django/conf目录。主要逻辑在__init____.py文件中。

python 复制代码
# django/conf/__init__.py

# settings是一个对象,通过LazySettings类初始化实例
settings = LazySettings()

# 具体加载逻辑,通过Settings类进行初始化
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
class LazySettings(LazyObject):
    def _setup(self, name=None):
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
        self._wrapped = Settings(settings_module)

加载的逻辑没有太多复杂的地方,主要解析下django的懒加载类LazyObject。

用到了比较多的魔法函数。

python 复制代码
# django/utils/functional.py
empty = object()

def new_method_proxy(func):
    def inner(self, *args):
        if (_wrapped := self._wrapped) is empty:
            self._setup()
            _wrapped = self._wrapped
        return func(_wrapped, *args)

    inner._mask_wrapped = False
    return inner

class LazyObject:
    _wrapped = None
    # 初始化为empty
    def __init__(self):
        self._wrapped = empty

    # 属性访问的魔法函数,settings.debug
    def __getattribute__(self, name):
    def __setattr__(self, name, value):
    def __delattr__(self, name):

    # 浅拷贝和深拷贝的魔法函数
    def __copy__(self):
    def __deepcopy__(self, memo):

    # 容器访问的魔法函数,settings['debug']
    __getitem__ = new_method_proxy(operator.getitem)
    __setitem__ = new_method_proxy(operator.setitem)
    __delitem__ = new_method_proxy(operator.delitem)

    # 其他魔法函数
    __iter__ = new_method_proxy(iter)
    __len__ = new_method_proxy(len)
相关推荐
言乐63 小时前
Python实现语音审核模型
开发语言·python·django·virtualenv·pygame
言乐67 小时前
Python语音检索
开发语言·python·django·virtualenv·pygame
言乐610 小时前
Python文字审核模型
开发语言·windows·python·django·pygame
打工仔折腾 AI16 小时前
多台服务器日志分散难查?用Promtail+Loki+Grafana搭建集中检索平台
服务器·人工智能·后端·python·性能优化·django·grafana
言乐61 天前
Python自动去除水印
开发语言·python·django·virtualenv·pygame
小蒜学长1 天前
基于Python的动物救助站管理系统的设计与实现(代码+数据库+LW)
数据库·后端·python·django·动物救助
言乐61 天前
Python实现关税自动计算模型
开发语言·python·django·virtualenv·pygame
FYKJ_20102 天前
springboot贺州地方新闻网站87812-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·django·课程设计
高洁013 天前
AI视频生成技术:从静态图文到动态视觉的内容智能革命
python·深度学习·django·transformer·tornado
我的xiaodoujiao3 天前
Django 基础知识详细图文教程 12-Django 模型定义与使用 2
后端·python·django