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)
相关推荐
winfredzhang3 小时前
从零构建家庭照片管理系统:Django 模块化单体实战,以及我踩到的 4 个真实坑
python·postgresql·django·sqlite·bootsrap
weixin_BYSJ19877 小时前
springboot智慧公共交通系统---附源码51123
java·javascript·spring boot·python·django·flask·php
衿心.7 小时前
Django TemplateDoesNotExist
数据库·django·sqlite
SelectDB技术团队2 天前
腾讯音乐内容库 ES 替代:从 Elasticsearch 到 Apache Doris 统一搜索分析引擎实践
elasticsearch·django·apache doris
willhu20083 天前
Windows 开机自动启动 Django 项目
后端·python·django
En^_^Joy3 天前
Django模板与静态文件使用指南
python·django·sqlite
weixin_BYSJ19873 天前
springboot小区物业管理小程序---附源码45555
java·javascript·spring boot·python·django·flask·php
En^_^Joy3 天前
Django中间件:请求拦截和响应(类似装饰器)
中间件·django·sqlite
qq_22589174663 天前
基于Flask的空气质量监测与预测分析系统
开发语言·后端·python·信息可视化·django·flask