Django的Settings 配置文件详解
Django Settings 配置文件详解
示例代码
"""
Django settings for back_stage_management_django project.Generated by 'django-admin startproject' using Django 5.0.3.For more information on this file, see
https://docs.djangoproject.com/en/5.0/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.0/ref/settings/
"""from pathlib import Path# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-8pf_9*jnm8@)6(#bn=4ojbot+pcc^cszvpk&@)b)uux*sj=bq6'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','goods', # 确保这里和你的应用名一致'rest_framework'
]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 = 'back_stage_management_django.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'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 = 'back_stage_management_django.wsgi.application'# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
# }
# mysql
DATABASES = {'default': { # 默认数据库配置(Django 支持多数据库配置)'ENGINE': 'django.db.backends.mysql', # 指定使用 MySQL 后端'NAME': 'backstage', # 数据库名(需提前创建)'USER': 'root', # MySQL 用户名'PASSWORD': '111111', # MySQL 密码'HOST': 'localhost', # 数据库服务器地址(默认本地)'PORT': '3306', # MySQL 默认端口'OPTIONS': { # 额外选项(关键配置)'charset': 'utf8mb4', # 字符集设置为 utf8mb4'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", # 初始化 SQL 命令}}
}# Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validatorsAUTH_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/5.0/topics/i18n/LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/STATIC_URL = 'static/'# Default primary key field type
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-fieldDEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
概述
Django的settings.py文件是项目的核心配置文件,包含了所有项目运行所需的设置。以下是对各部分的详细说明:
基本路径配置
BASE_DIR = Path(__file__).resolve().parent.parent
定义了项目根目录的路径
使用Pathlib模块,更现代的文件路径处理方式
安全设置
SECRET_KEY = 'django-insecure-8pf_9*jnm8@)6(#bn=4ojbot+pcc^cszvpk&@)b)uux*sj=bq6'
重要: 生产环境必须更换为随机生成的密钥,且不能泄露
用于加密签名、会话、密码重置令牌等
DEBUG = True
开发时设为True,生产环境必须设为False
开启时会显示详细错误信息
ALLOWED_HOSTS = []
生产环境需要添加允许访问的域名/IP
例如:
['example.com', '192.168.1.1']
应用配置
INSTALLED_APPS = ['django.contrib.admin', # 管理后台'django.contrib.auth', # 认证系统'django.contrib.contenttypes', # 内容类型框架'django.contrib.sessions', # 会话框架'django.contrib.messages', # 消息框架'django.contrib.staticfiles', # 静态文件管理'goods', # 你的自定义应用'rest_framework' # Django REST framework
]
中间件配置
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',
]
数据库配置
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'backstage','USER': 'root','PASSWORD': '111111','HOST': 'localhost','PORT': '3306','OPTIONS': {'charset': 'utf8mb4','init_command': "SET sql_mode='STRICT_TRANS_TABLES'",}}
}
已从SQLite切换到MySQL配置
确保数据库已创建且用户权限正确
可以注释/移除的组件
根据项目需求,以下Django自带组件可以酌情注释掉:
1. 如果不使用Django自带的管理后台:
# 'django.contrib.admin', # 管理后台
2. 如果不使用用户认证系统:
# 'django.contrib.auth', # 认证系统
# 'django.contrib.contenttypes', # 内容类型框架(依赖auth)
3. 如果不使用会话功能:
# 'django.contrib.sessions', # 会话框架
4. 如果不使用消息框架:
# 'django.contrib.messages', # 消息框架
5. 对应的中间件也可以注释:
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
# 'django.contrib.messages.middleware.MessageMiddleware',
6. 密码验证器(根据安全需求调整):
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',# },
]
Django 密码验证器详解
什么是密码验证器?
密码验证器是Django的安全机制,用于在用户设置或修改密码时进行强度检查,确保用户不会使用过于简单或不安全的密码。
四个内置验证器详解
1. UserAttributeSimilarityValidator
作用:检查密码是否与用户的个人信息过于相似
{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator','OPTIONS': {'user_attributes': ('username', 'first_name', 'last_name', 'email'),'max_similarity': 0.7 # 相似度阈值(0-1之间)}
}
示例:
用户名为
john123
,密码为john123456
→ 会被拒绝用户邮箱
john@example.com
,密码为examplejohn
→ 会被拒绝
2. MinimumLengthValidator
作用:强制密码最小长度
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator','OPTIONS': {'min_length': 8 # 默认8位,可自定义}
}
示例:
密码
abc123
(6位)→ 会被拒绝密码
password123
(11位)→ 通过
3. CommonPasswordValidator
作用:阻止使用常见弱密码
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'
}
会阻止的密码示例:
123456
、password
、qwerty
、admin
111111
、abc123
、letmein
基于包含2万个常见密码的列表进行检查
4. NumericPasswordValidator
作用:阻止纯数字密码
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'
}
示例:
12345678
→ 会被拒绝abc12345
→ 通过(包含字母)p@ssw0rd
→ 通过(包含特殊字符)
验证器的工作时机
密码验证器在以下情况下自动触发:
用户注册时设置新密码
修改密码时
管理员后台修改用户密码
使用
set_password()
方法时
验证失败的表现
当密码不符合要求时,Django会:
抛出
ValidationError
异常显示具体的错误信息给用户
阻止密码设置操作
错误示例:
• 密码与用户名太相似了。 • 密码长度至少为8个字符。 • 密码太常见了。 • 密码不能全是数字。
核心要点
django.contrib.auth
→ 提供密码验证功能AUTH_PASSWORD_VALIDATORS
→ 配置验证规则两者需要同时存在才能正常工作
如果移除auth应用,整个密码验证系统都会失效
国际化设置
LANGUAGE_CODE = 'en-us' # 可改为 'zh-hans' 使用中文
TIME_ZONE = 'UTC' # 可改为 'Asia/Shanghai'
USE_I18N = True # 启用国际化
USE_TZ = True # 使用时区
静态文件设置
STATIC_URL = 'static/'
# 生产环境需要添加:
# STATIC_ROOT = BASE_DIR / 'staticfiles'
建议的简化配置
对于API项目(如使用DRF),可以简化如下:
INSTALLED_APPS = [# 'django.contrib.admin', # 注释掉admin'django.contrib.auth','django.contrib.contenttypes',# 'django.contrib.sessions', # 如果不用会话# 'django.contrib.messages', # 如果不用消息框架'django.contrib.staticfiles','goods','rest_framework'
]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',
]
扩展
'django.contrib.auth',
'django.contrib.contenttypes',
如果不注释这两个应用,迁移数据库时会确实会创建Django自带的系统表。
会多出的Django自带表
来自 django.contrib.auth
的表:
auth_user -- 用户表(存储用户名、密码、邮箱等)
auth_group -- 用户组表
auth_permission -- 权限表
auth_user_groups -- 用户-组关联表(多对多)
auth_user_user_permissions -- 用户-权限关联表(多对多)
来自 django.contrib.contenttypes
的表:
django_content_type -- 内容类型表(记录所有注册的模型信息)
是否应该保留?
建议保留的情况:
需要用户认证功能 - 登录、注册、权限管理
使用DRF认证 - REST framework依赖这些表
需要后台管理 - admin依赖auth系统
未来可能扩展 - 保留基础功能更灵活
可以注释的情况:
纯API服务 - 完全自己实现认证
微服务架构 - 认证由专门的服务处理
极致性能要求 - 减少不必要的表
确定不需要用户功能 - 简单的数据处理服务
如果你选择保留
这是完全正常的!大多数Django项目都保留这些表,因为它们提供了:
开箱即用的用户系统
完整的权限管理
与Django生态的良好集成
安全可靠的密码处理
注意事项
生产环境必须修改:
设置
DEBUG = False
生成新的
SECRET_KEY
配置正确的
ALLOWED_HOSTS
使用生产数据库配置
组件依赖关系:
某些组件有依赖关系,注释时要注意
比如
auth
依赖contenttypes
根据项目类型调整:
纯API项目可以移除模板相关配置
传统Web项目需要保留更多组件
这样的配置既保持了核心功能,又移除了不必要的组件,提高了项目运行效率。