签入版本
This commit is contained in:
@@ -0,0 +1,374 @@
|
||||
# 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')
|
||||
Reference in New Issue
Block a user