一、用户配置settings 文件介绍
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '0$bru9r7b^^9aydq(4+%9$s1)ibx+c!y_1=+=9e*^zs7%10yv*'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'test_django.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR , 'templates']
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'test_django.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
BASE_DIR
:当前项目的项目路径SECRET_KEY
:session 相关不用操作DEBUG = True
:项目上线之后改为False
,在调试时会不停地打印一些信息,所以上线后要修改ALLOWED_HOSTS = []
:允许访问的主机,上线之后可以中括号内加上* 代表所有
INSTALLED_APPS
字典:注册的功能模块字典MIDDLEWARE
:Django 中间件TEMPLATES
: HTML 文件存放路径配置DATABASES
:项目指定的数据库,默认使用的是sqlite3
,可以修改AUTH_PASSWORD_VALIDATORS
:认证相关LANGUAGE_CODE
:文字编码
二、系统默认配置文件
全部的系统默认配置文件
from django.conf import global_settings
从系统默认配置文件中能观察到用户的配置文件中有的字段,系统默认的配置文件都有
在用户配置文件中修改了配置之后,功能是如何生效的?
2.1 修改配置
在 Django 中想要使用配置文件,**正确的配置方式应该是导入系统配置文件 **
from django.conf import settings
区别于:from django.conf import global_setting
这个 settings
既可以导入用户的配置文件,也可以导入系统默认的所有的配置
settings 源码分析
from django.conf import settings
点进去发现,settings = LasySettings()
,其本质就是LasySettings
类实例化的对象
从入口文件manage.py
开始
通过
os.environ.setdefault('...','...')
设置了一个全局变量,该全局变量的值,就是用户配置文件的路径那么,可以别的文件可以通过
os.environ.get()
方法获取到该文件
主要的功能文件
导入系统默认的配置文件
通过
反射
,循环获取到系统配置文件中的变量以及对应的值,在将变量名和变量值添加到对象的属性中去;环境变量中获取到用户配置文件的路径,通过 importlib 模块中的方法,根据文件字符串导入文件
通过
反射
,循环获取到用户的配置文件中的变量以及对应的值,在将变量名和变量值添加到对象的属性中去;因为用户配置文件是后导入的,所以会覆盖已经存在的系统的配置!!!
2.2 settings 源码应用
在自己的项目中实现与 Django 配置文件一样的功能
模拟文件配置
# 暴露给用户的配置文件
conf 文件夹
----settings.py 用户配置文件
# 系统配置文件
lib 文件夹
----conf 文件夹
----__init__.py
----global_settings.py 系统配置文件
# 启动文件
manage.py
manage.py
设置全局变量就是为了能够在别的文件中找到用户配置文件夹
import os
import sys
# 项目路径添加到环境变量
sys.path.append(os.path.dirname(__file__))
if __name__ == '__main__':
# 项目全局设置一个变量
os.environ.setdefault('user_settings','conf.settings')
from lib.conf import settings
print(settings.NAME)
__init__.py
可以根据环境变量,获取到字符串类型文件路径,再导入文件
也可以直接导入用户配置文件
import importlib
import os
from lib.conf import global_settings
class Settings():
def __init__(self):
for name in dir(global_settings):
# 筛选出纯大写变量名
if name.isupper():
# 根据大写的名字获取对应的值
value = getattr(global_settings, name)
setattr(self,name,value)
# 获取用户配置
module_path_str = os.environ.get('user_settings')
# 根据字符串路径导入配置文件
module_name = importlib.import_module(module_path_str)
for name in dir(module_name):
# 筛选出纯大写变量名
if name.isupper():
# 根据大写的名字获取对应的值
value = getattr(module_name, name)
setattr(self,name,value)
settings = Settings()
接下来,直接修改用户配置文件或者修改系统配置文件就可以
其核心在于先读取了系统的配置文件,后读取了用户的配置文件,所以修改了用户的配置文件之后,会将系统配置文件给覆盖