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 = 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',
'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-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/5.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_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-field
DEFAULT_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项目需要保留更多组件
-
这样的配置既保持了核心功能,又移除了不必要的组件,提高了项目运行效率。