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 = 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'
}

会阻止的密码示例

  • 123456passwordqwertyadmin

  • 111111abc123letmein

  • 基于包含2万个常见密码的列表进行检查

4. NumericPasswordValidator

作用:阻止纯数字密码

复制代码
{
    'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'
}

示例

  • 12345678会被拒绝

  • abc12345通过(包含字母)

  • p@ssw0rd通过(包含特殊字符)

验证器的工作时机

密码验证器在以下情况下自动触发:

  1. 用户注册时设置新密码

  2. 修改密码

  3. 管理员后台修改用户密码

  4. 使用 set_password() 方法时

验证失败的表现

当密码不符合要求时,Django会:

  1. 抛出 ValidationError 异常

  2. 显示具体的错误信息给用户

  3. 阻止密码设置操作

错误示例

复制代码
• 密码与用户名太相似了。
• 密码长度至少为8个字符。
• 密码太常见了。
• 密码不能全是数字。
核心要点
  1. django.contrib.auth → 提供密码验证功能

  2. AUTH_PASSWORD_VALIDATORS → 配置验证规则

  3. 两者需要同时存在才能正常工作

  4. 如果移除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       -- 内容类型表(记录所有注册的模型信息)

是否应该保留?

建议保留的情况:
  1. 需要用户认证功能 - 登录、注册、权限管理

  2. 使用DRF认证 - REST framework依赖这些表

  3. 需要后台管理 - admin依赖auth系统

  4. 未来可能扩展 - 保留基础功能更灵活

可以注释的情况:
  1. 纯API服务 - 完全自己实现认证

  2. 微服务架构 - 认证由专门的服务处理

  3. 极致性能要求 - 减少不必要的表

  4. 确定不需要用户功能 - 简单的数据处理服务

如果你选择保留

这是完全正常的!大多数Django项目都保留这些表,因为它们提供了:

  1. 开箱即用的用户系统

  2. 完整的权限管理

  3. 与Django生态的良好集成

  4. 安全可靠的密码处理

注意事项

  1. 生产环境必须修改

    • 设置 DEBUG = False

    • 生成新的 SECRET_KEY

    • 配置正确的 ALLOWED_HOSTS

    • 使用生产数据库配置

  2. 组件依赖关系

    • 某些组件有依赖关系,注释时要注意

    • 比如 auth 依赖 contenttypes

  3. 根据项目类型调整

    • 纯API项目可以移除模板相关配置

    • 传统Web项目需要保留更多组件

这样的配置既保持了核心功能,又移除了不必要的组件,提高了项目运行效率。

相关推荐
BD_Marathon40 分钟前
【Flink】部署模式
java·数据库·flink
csudata1 小时前
十年磨一剑,中启乘数CData数据库一体机重新定义企业级数据库解决方案
数据库·数据库开发
TDengine (老段)2 小时前
TDengine IDMP 应用场景:工业锅炉监控
大数据·数据库·物联网·信息可视化·时序数据库·tdengine
风清再凯4 小时前
DRF序列化器
django
遇见你的雩风6 小时前
【MySQL】CRUD基础详解
数据库·mysql
夜雨听萧瑟7 小时前
sqlite创建数据库,创建表,插入数据,查询数据的C++ demo
数据库·sqlite
.Shu.8 小时前
Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【四、事务引擎核心 - MVCC与锁机制】
数据库·mysql
多工坊8 小时前
【DataGrip】连接达梦数据库后,能查询数据但是看不到表的几种情况分析,达梦数据库驱动包下载DmJdbcDriver18.jar
java·数据库·jar
何中应9 小时前
如何用Redis作为消息队列
数据库·redis·缓存