Files
2026-09-12 12:07:15 +08:00

375 lines
12 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# application/settings.py
"""
Django项目配置文件
=============================================================
Django settings for application project.
Generated by 'django-admin startproject' using Django 3.2.3.
该文件包含项目的所有配置项,包括:
- 基础路径配置
- 安全配置(密钥、调试模式、跨域等)
- 应用注册
- 中间件配置
- 数据库配置
- 静态文件配置
- 验证码配置等
For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import os.path
import socket
import sys
from pathlib import Path
# 预先加载配置文件,切记此处不可删除
# 该导入用于加载 .env 环境变量文件
from extends.extends_dotenv import env_path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
from config import env
from config.env import *
# 设置默认编码
if sys.platform == 'win32':
import locale
# 设置控制台编码
if sys.stdout.encoding != 'utf-8':
sys.stdout.reconfigure(encoding='utf-8')
if sys.stderr.encoding != 'utf-8':
sys.stderr.reconfigure(encoding='utf-8')
# 设置环境变量
os.environ['PYTHONIOENCODING'] = 'utf-8'
os.environ['PYTHONUTF8'] = '1'
# ==================== 项目基础路径配置 ====================
# 项目根目录路径
# 获取当前文件所在目录的父目录(即项目根目录)
BASE_DIR = Path(__file__).resolve().parent.parent
# 自定义Python模块搜索路径
# 将项目根目录和apps目录添加到系统路径,便于导入模块
sys.path.insert(0, BASE_DIR) # 添加项目根目录
sys.path.insert(1, os.path.join(BASE_DIR, 'apps')) # 添加apps应用目录
# ==================== 安全配置 ====================
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
# 项目密钥,用于加密session、CSRF等,生产环境必须修改为复杂字符串
SECRET_KEY = 'django-insecure-!kjxf&e0pn4nrl%0&9sqp7n!ld)(gtw7v@i3fwf3sqcsh4ymat'
# SECURITY WARNING: don't run with debug turned on in production!
# 调试模式开关:True-开启详细错误页面,False-生产环境必须关闭
DEBUG = True
# ==================== 跨域处理配置 ====================
# 以下配置用于解决前后端分离时的跨域访问问题
# 是否允许跨域请求携带凭证(如cookies)
CORS_ALLOW_CREDENTIALS = True
# 是否允许所有域名跨域访问(开发环境使用,生产环境建议限制)
CORS_ORIGIN_ALLOW_ALL = True
# 允许跨域的白名单域名(注释掉的示例)
# CORS_ORIGIN_WHITELIST = (
# 'http://127.0.0.1:8080',
# )
# 允许跨域的正则表达式匹配规则
# 匹配所有http开头的域名
CORS_ALLOWED_ORIGINS_REGEXES = [
r'^http://.*?$',
]
# 注释掉的跨域域名白名单正则配置
# CORS_ORIGIN_REGEXES_WHITELIST = (
# r'^http://.*?$',
# )
# 允许跨域的HTTP请求方法
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
# 允许跨域的HTTP请求头
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization', # 授权头,用于JWT认证
'content-type', # 内容类型
'dnt', # Do Not Track
'origin', # 源地址
'user-agent', # 用户代理
'x-csrftoken', # CSRF令牌
'x-requested-with', # 异步请求标识
'Pragma', # 缓存控制
)
# ==================== 主机访问配置 ====================
# 允许访问的主机列表
# 使用*通配符默认所有IP均可,生产环境建议限制为具体域名
ALLOWED_HOSTS = ['*']
# 是否开启URL末尾斜杠自动补充
# True: 访问/url时会自动重定向到/url/
APPEND_SLASH = True
# ==================== 应用注册配置 ====================
# Application definition
INSTALLED_APPS = [
# 第三方应用
'corsheaders', # 跨域处理应用
'rest_framework', # Django REST Framework
'captcha', # 验证码应用
# Django内置应用
'django.contrib.admin', # 管理后台
'django.contrib.auth', # 认证系统
'django.contrib.contenttypes', # 内容类型框架
'django.contrib.sessions', # 会话框架
'django.contrib.messages', # 消息框架
'django.contrib.staticfiles', # 静态文件管理
# 扩展应用
'application', # 主应用
# 业务子应用(按模块划分)
'application.login', # 登录模块
'application.level', # 职级管理
'application.position', # 岗位管理
'application.dept', # 部门管理
'application.role', # 角色管理
'application.role_menu', # 角色菜单关联
'application.city', # 城市管理
'application.link', # 友情链接
'application.notice', # 公告管理
'application.user', # 用户管理
'application.user_role', # 用户角色关联
'application.dict', # 字典管理
'application.dict_item', # 字典项管理
'application.config', # 配置管理
'application.config_item', # 配置项管理
'application.param', # 参数管理
'application.file_template', # 文件模板管理
'application.menu', # 菜单管理
'application.config_web', # Web配置
'application.upload', # 文件上传
'application.generator', # 代码生成器
'application.job', # 定时任务
'application.job_log', # 任务日志
'application.login_log', # 登录日志
'application.operation_log', # 操作日志
'application.category', # 文章分类
'application.article', # 文章管理
'application.example', # 案例管理
]
# ==================== 中间件配置 ====================
MIDDLEWARE = [
# 跨域处理中间件(必须放在最前面)
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# CSRF中间件已注释,使用JWT进行认证
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 此配置用于解决弹窗被浏览器劫持问题
# SAMEORIGIN: 只允许同源页面嵌入iframe
X_FRAME_OPTIONS = 'SAMEORIGIN'
# ==================== URL路由配置 ====================
# 根URL配置模块路径
ROOT_URLCONF = 'application.urls'
# ==================== 模板配置 ====================
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 模板文件搜索路径
'DIRS': [os.path.join(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',
],
'libraries': { # 模板标签库配置
},
},
},
]
# ==================== WSGI应用配置 ====================
WSGI_APPLICATION = 'application.wsgi.application'
# ==================== 数据库配置 ====================
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
# 默认数据库配置(从环境变量读取)
# SQLite配置(注释掉,留作备用)
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
"default": {
"ENGINE": env.DATABASE_ENGINE, # 数据库引擎
"NAME": env.DATABASE_NAME, # 数据库名称
"USER": env.DATABASE_USER, # 数据库用户名
"PASSWORD": env.DATABASE_PASSWORD, # 数据库密码
"HOST": env.DATABASE_HOST, # 数据库主机地址
"PORT": env.DATABASE_PORT, # 数据库端口
}
}
# ==================== 缓存配置(Redis) ====================
# 使用 Redis 作为缓存后端,用于存储 JWT Token 黑名单等
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": f"redis://{env.REDIS_HOST}:{env.REDIS_PORT}/{env.REDIS_DB}",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": env.REDIS_PASSWORD if env.REDIS_PASSWORD else None,
"SOCKET_CONNECT_TIMEOUT": 5, # 连接超时(秒)
"SOCKET_TIMEOUT": 5, # 读写超时(秒)
"CONNECTION_POOL_KWARGS": {"max_connections": 100}, # 连接池大小
"IGNORE_EXCEPTIONS": True, # Redis不可用时不抛异常,降级处理
},
"KEY_PREFIX": "djangoadmin", # Key前缀,避免多项目共用Redis时冲突
}
}
# ==================== 密码验证配置 ====================
# https://docs.djangoproject.com/en/3.2/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',
# 验证密码是否为纯数字
},
]
# ==================== 国际化配置 ====================
# https://docs.djangoproject.com/en/3.2/topics/i18n/
# 语言代码
LANGUAGE_CODE = 'en-us'
# 时区设置(亚洲/上海)
TIME_ZONE = 'Asia/Shanghai'
# 是否启用国际化
USE_I18N = True
# 是否启用本地化格式化
USE_L10N = True
# 是否使用时区支持(False表示不使用UTC)
USE_TZ = False
# ==================== 静态文件配置 ====================
# https://docs.djangoproject.com/en/3.2/howto/static-files/
# 静态文件访问URL前缀
STATIC_URL = '/static/'
# 静态文件搜索目录
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "public/static"),
]
# ==================== 主键字段配置 ====================
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
# 默认主键字段类型
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# ==================== Django REST Framework配置 ====================
REST_FRAMEWORK = {
# 默认认证类:使用JWT查询参数认证
'DEFAULT_AUTHENTICATION_CLASSES': ['api.extensions.auth.JwtQueryParamsAuthentication']
}
# ==================== 数据库表前缀配置 ====================
# 数据表前缀(从环境变量获取,默认为空)
# DATABASE_PREFIX = locals().get('DATABASE_PREFIX', "")
# ==================== 验证码相关配置 ===========================
# 验证码图片尺寸(宽度, 高度)
CAPTCHA_IMAGE_SIZE = (200, 60)
# 验证码字符个数
CAPTCHA_LENGTH = 6
# 验证码超时时间(分钟)
CAPTCHA_TIMEOUT = 1
# 验证码输出格式
CAPTCHA_OUTPUT_FORMAT = "%(image)s %(text_field)s %(hidden_field)s "
# 验证码字体大小
CAPTCHA_FONT_SIZE = 40
# 验证码前景色(绿色)
CAPTCHA_FOREGROUND_COLOR = "#1d953f"
# 验证码背景色(白色)
CAPTCHA_BACKGROUND_COLOR = "#ffffff"
# 验证码噪点函数配置
CAPTCHA_NOISE_FUNCTIONS = (
'captcha.helpers.noise_null', # 无噪点
"captcha.helpers.noise_arcs", # 弧线噪点
"captcha.helpers.noise_dots", # 点状噪点
)
# 验证码生成函数(随机字符验证码)
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge' # 字母验证码
# CAPTCHA_CHALLENGE_FUNCT = "captcha.helpers.math_challenge" # 加减乘除验证码(注释备选)
# ==================== 站点域名配置 ====================
# 站点域名(用于定时任务生成完整URL,从 .env 读取)
# 可选值示例: http://127.0.0.1:8000, http://localhost:8000, https://www.example.com
SITE_DOMAIN = os.getenv('SITE_DOMAIN', 'http://127.0.0.1:8000')