Files
Django/a_long_dianjing/settings.py

527 lines
15 KiB
Python
Raw 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.
"""
Django settings for a_long_dianjing project.
开发环境配置 - 参照旧项目结构精简
"""
from pathlib import Path
from datetime import timedelta
import os
# 从密钥配置文件导入敏感信息
try:
import _secrets
except ImportError:
raise ImportError("缺少 secrets.py 密钥配置文件,请参照项目说明创建")
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
SECRET_KEY = _secrets.SECRET_KEY
DEBUG = False # 开发环境为 True
ALLOWED_HOSTS = ['localhost', '127.0.0.1','www.abas.asia'] # 根据开发前端地址可添加
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 第三方应用 (根据 requirements.txt 已安装的)
'rest_framework',
'rest_framework_simplejwt',
'corsheaders',
'django_celery_results',
# 你的自定义应用 (按已创建的拼音命名)
'celery',
'yonghu',
'dingdan',
'shangpin',
'peizhi',
'houtai',
# 'games', # 【待确认】你提到 games 还没创建,暂不添加
'utils',
'shangdian',
'dengji',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 跨域中间件放最前
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # 默认开启如API无需可注释
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'guanapi.middleware.OpLogMiddleware', # 【待确认】这是旧项目的自定义中间件,新项目需要吗?
]
ROOT_URLCONF = 'a_long_dianjing.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'a_long_dianjing.wsgi.application'
# Database
# 根据你提供的信息配置 (本地开发端口3307)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': _secrets.DATABASE_NAME,
'USER': _secrets.DATABASE_USER,
'HOST': _secrets.DATABASE_HOST,
'PASSWORD': _secrets.DATABASE_PASSWORD,
'PORT': _secrets.DATABASE_PORT,
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET time_zone='+08:00'", # 保持与旧项目一致
}
}
}
# Password validation
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
LANGUAGE_CODE = 'zh-Hans' # 使用中文
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = False # 保持与旧项目一致不使用UTC时区
# Static files (CSS, JavaScript, Images)
STATIC_URL = 'static/'
# 开发环境静态文件目录,可参照旧项目添加 MEDIA 配置
# MEDIA_URL = 'media/'
# MEDIA_ROOT = BASE_DIR / 'media'
# Default primary key field type
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# ==================== 以下为第三方库及自定义配置 ====================
# settings.py
# 修改SIMPLE_JWT配置
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=36500),
'REFRESH_TOKEN_LIFETIME': timedelta(days=36500),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': False,
'UPDATE_LAST_LOGIN': False,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUDIENCE': None,
'ISSUER': None,
'JWK_URL': None,
'LEEWAY': 0,
'AUTH_HEADER_TYPES': ('Bearer',),
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
# 修改这里使用yonghuid而不是id
'USER_ID_FIELD': 'yonghuid',
'USER_ID_CLAIM': 'yonghuid',
'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',
'JTI_CLAIM': 'jti',
}
# 添加自定义认证后端
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
]
# 必须指定用户模型即使它不继承AbstractBaseUser
AUTH_USER_MODEL = 'yonghu.UserMain'
# DRF配置也非常简单
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle', # 匿名用户限制
'rest_framework.throttling.UserRateThrottle', # 登录用户限制
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/minute', # 匿名用户每分钟100次
'user': '1000/minute', # 登录用户每分钟1000次
},
# 🔥 关键:使用自定义异常处理器
'EXCEPTION_HANDLER': 'utils.exception_handler.custom_exception_handler',
# 🔥 生产环境只返回JSON不返回HTML更安全
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
],
}
# settings.py
# H5静态页面域名配置
H5_DOMAIN = 'https://www.abas.asia:666' # 生产环境
# H5_DOMAIN = 'https://test-h5.yourdomain.com' # 测试环境
# CORS settings
CORS_ALLOWED_ORIGINS = [
"http://localhost:8080", # 假设前端开发服务器地址
"http://127.0.0.1:8080",
"https://www.abas.asia",
#"http://192.168.240.1:5173/",
"https://www.abas.asia:666",
"https://www.abas.asia:1234",
"https://www.abas.asia:963",
"http://localhost:5174",
"http://localhost:5173",
"http://localhost:3000",
"http://localhost:3001",
#"www.abas.asia",
]
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_METHODS = (
"GET",
"POST",
"PUT",
"PATCH",
"DELETE",
"OPTIONS",
)
CORS_ALLOW_HEADERS = [
"accept",
"accept-encoding",
"authorization",
"content-type",
"dnt",
"origin",
"user-agent",
"x-csrftoken",
"x-requested-with",
]
# 【待确认】自定义用户模型,你需要在 yonghu/models.py 中创建 class Yonghu
#AUTH_USER_MODEL = 'yonghu.Yonghu'
# OSS配置
COS_SECRET_ID = _secrets.COS_SECRET_ID
COS_SECRET_KEY = _secrets.COS_SECRET_KEY
COS_REGION = _secrets.COS_REGION
COS_BUCKET = _secrets.COS_BUCKET
COS_SCHEME = 'https' # 使用HTTPS
COS_DOMAIN = f'https://{COS_BUCKET}.cos.{COS_REGION}.myqcloud.com'
COS_APPID = _secrets.COS_APPID
COS_STS_DURATION = 7200 # STS临时凭证有效期
# ==================== 业务相关配置 (值先空着,结构可保留) ====================
# 微信小程序配置
WEIXIN_APPID = _secrets.WEIXIN_APPID
WEIXIN_SECRET = _secrets.WEIXIN_SECRET
WEIXIN_MCHID = _secrets.WEIXIN_MCHID
WEIXIN_SHANGHUMIYAO = _secrets.WEIXIN_SHANGHUMIYAO
# 服务号配置
WEIXIN_OFFICIAL_APPID = _secrets.WEIXIN_OFFICIAL_APPID
WEIXIN_OFFICIAL_SECRET = _secrets.WEIXIN_OFFICIAL_SECRET
WEIXIN_OFFICIAL_TOKEN = _secrets.WEIXIN_OFFICIAL_TOKEN
WEIXIN_OFFICIAL_ENCODING_AES_KEY = _secrets.WEIXIN_OFFICIAL_ENCODING_AES_KEY
WEIXIN_TEMPLATE_ID = _secrets.WEIXIN_TEMPLATE_ID
# 🆕【新增】模板消息配置
WEIXIN_TEMPLATE_MAX_PER_MINUTE = 950 # 每分钟最大发送量留50缓冲
WEIXIN_TEMPLATE_BATCH_SIZE = 100 # 每批发送数量
WEIXIN_CERT_PATH = _secrets.WEIXIN_CERT_PATH
WEIXIN_KEY_PATH = _secrets.WEIXIN_KEY_PATH
WEIXIN_NOTIFY_URL = 'https://www.abas.asia/hqhd/dingdan/pay-notify/' # 支付回调地址http://你的域名/api/pay/callback/
# settings.py 或相应配置文件中
WEIXIN_PAY_DESCRIPTION = "网络服务" # 支付描述
# 押金充值相关配置
YAJIN_PAY_DESCRIPTION = "打手押金充值" # 押金支付描述
YAJIN_PAY_NOTIFY_URL = "https://www.abas.asia/hqhd/shangpin/yajinhuitiao" # 押金支付回调地址
# 积分充值相关配置
JIFEN_PAY_DESCRIPTION = "打手积分补充" # 积分支付描述
JIFEN_PAY_NOTIFY_URL = "https://www.abas.asia/hqhd/shangpin/jifenhuitiao" # 积分支付回调地址
# 会员充值相关配置
HUIYUAN_PAY_DESCRIPTION = "打手会员充值" # 会员支付描述
HUIYUAN_PAY_NOTIFY_URL = "https://www.abas.asia/hqhd/shangpin/huiyuanhuitiao" # 会员支付回调地址
# 考核支付配置
KAOHE_PAY_DESCRIPTION = '考核金牌-缴纳考核费'
KAOHE_PAY_NOTIFY_URL = 'https://www.abas.asia/hqhd/yonghu/kh_huitiao' # 替换为实际回调地址
KAOHE_PAY_DEFAULT_FEE = 5.00 # 未配置费用时的默认金额
# settings.py
SHANGJIA_CZ_PREFIX = "CzSJ" # 商家充值订单前缀
SHANGJIA_CZ_PAY_DESCRIPTION = "阿龙电竞-商家余额充值"
SHANGJIA_CZ_PAY_NOTIFY_URL = "https://www.abas.asia/hqhd/shangpin/sjhuitiao"
SHANGJIA_CZ_MIN_AMOUNT = 1
SHANGJIA_CZ_MAX_AMOUNT = 10000
# 罚款缴纳微信支付配置
FAKUAN_PAY_DESCRIPTION = '罚款缴纳' # 支付描述
FAKUAN_PAY_NOTIFY_URL = 'https://www.abas.asia/hqhd/yonghu/fk_huitiao' # 微信支付回调地址(根据实际域名调整)
# 订单ID前缀配置
ORDER_PREFIX = {
'yajin': 'CzYJ', # 押金订单前缀
'jifen': 'CzJF', # 积分订单前缀
'huiyuan': 'CzHY', # 会员订单前缀
}
# 腾讯云即时通讯 (IM) - 开发环境可暂不配置
TENCENT_IM_CONFIG = {
'SDK_APP_ID': 0, # 整数
'SECRET_KEY': '',
}
# 阿里云短信 - 开发环境可暂不配置
ALIYUN_SMS_CONFIG = {
'ACCESS_KEY_ID': '',
'ACCESS_KEY_SECRET': '',
'SIGN_NAME': '',
'TEMPLATE_CODE': '',
'REGION_ID': 'cn-hangzhou',
}
# HashID (用于加密ID旧项目有新项目需要吗)
# HASHID_FIELD_SALT = 'a_long_dianjing_2025_salt' # 【待确认】请设置你的盐值
# settings.py 尾部添加
# settings.py
# settings.py
# settings.py 中添加配置
GOEASY_APPKEY = _secrets.GOEASY_APPKEY
GOEASY_SECRET = _secrets.GOEASY_SECRET
GOEASY_REST_URL = 'https://rest-hz.goeasy.io/v2/im/message' # 正式环境
"""
阿龙电竞 - Django设置文件中的Celery配置部分
请在您的settings.py中添加以下配置
"""
# ==================== Celery配置 ====================
# Redis作为消息代理和结果后端
REDIS_HOST = _secrets.REDIS_HOST
REDIS_PORT = _secrets.REDIS_PORT
REDIS_PASSWORD = _secrets.REDIS_PASSWORD
REDIS_DB_CELERY = _secrets.REDIS_DB_CELERY
REDIS_DB_RESULT = _secrets.REDIS_DB_RESULT
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/2',
'TIMEOUT': 300,
'OPTIONS': {
# 不需要 CLIENT_CLASS
}
}
}
# 构建Redis连接字符串
if REDIS_PASSWORD:
CELERY_BROKER_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_CELERY}'
CELERY_RESULT_BACKEND = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_RESULT}'
else:
CELERY_BROKER_URL = f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_CELERY}'
CELERY_RESULT_BACKEND = f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_RESULT}'
# 任务接受的内容类型
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
# 时区设置
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = True
# settings.py 末尾添加(在其他 Celery 配置之后)
CELERY_IMPORTS = ('dingdan.tongzhi_tasks',)
# 任务超时设置
CELERY_TASK_TIME_LIMIT = 300 # 任务最大执行时间300秒
CELERY_TASK_SOFT_TIME_LIMIT = 240 # 软超时240秒
# Worker并发设置
CELERY_WORKER_CONCURRENCY = 4 # 根据服务器CPU核心数调整
CELERY_WORKER_PREFETCH_MULTIPLIER = 1
# 任务确认设置
CELERY_TASK_ACKS_LATE = True
CELERY_WORKER_DISABLE_RATE_LIMITS = True
# 队列配置
CELERY_TASK_DEFAULT_QUEUE = 'default'
CELERY_TASK_QUEUES = {
'default': {
'exchange': 'default',
'routing_key': 'default',
},
'order_tasks': {
'exchange': 'order_tasks',
'routing_key': 'order_tasks',
},
'periodic_tasks': {
'exchange': 'periodic_tasks',
'routing_key': 'periodic_tasks',
},
}
# ==================== 定时任务时间配置 ====================
# 所有时间配置都在这里,方便修改
# 订单超时时间(秒) - 48小时
ORDER_EXPIRE_SECONDS = 48000 * 60 * 60 # 172800秒
# 每日任务执行时间24小时制
DAILY_TASK_HOUR = 0 # 0点
DAILY_TASK_MINUTE = 30 # 0分
# 每月任务执行时间
MONTHLY_TASK_DAY = 1 # 每月1日
MONTHLY_TASK_HOUR = 0 # 0点
MONTHLY_TASK_MINUTE = 0 # 0分
# 订单检查频率(分钟)
ORDER_CHECK_INTERVAL = 5 # 每5分钟检查一次
# ==================== 跨平台订单互通配置 ====================
CROSS_PLATFORM_TOKEN = _secrets.CROSS_PLATFORM_TOKEN
PARTNER_BASE_URL = _secrets.PARTNER_BASE_URL
# 对方平台各接口路径(可根据实际情况调整,但双方需保持一致)
PARTNER_SYNC_ORDER_URL = '/dingdan/partner_sync_order' # 接收派单
PARTNER_CHECK_CLAIM_URL = '/dingdan/partner_check_claim' # 抢单询问
PARTNER_NOTIFY_CLAIM_URL = '/dingdan/partner_notify_claim' # 抢单成功通知
PARTNER_REFUND_NOTIFY_URL = '/dingdan/partner_refund_notify' # 退款通知
AGENT_SHANGJIA_ID = _secrets.AGENT_SHANGJIA_ID
CROSS_PLATFORM_MEMBER_ID = _secrets.CROSS_PLATFORM_MEMBER_ID
# 默认游戏类型ID当对方未传递时使用
CROSS_PLATFORM_GAME_TYPE_ID = 1
CROSS_PLATFORM_WHITELIST = _secrets.CROSS_PLATFORM_WHITELIST
SPECIAL_GUANSHI_IDS = _secrets.SPECIAL_GUANSHI_IDS
WECHAT_PAY_V3_CONFIG = {
'MCHID': _secrets.WECHAT_PAY_V3_MCHID,
'APPID': _secrets.WECHAT_PAY_V3_APPID,
'API_V3_KEY': _secrets.WECHAT_PAY_V3_API_V3_KEY,
'PRIVATE_KEY_PATH': _secrets.WECHAT_PAY_V3_PRIVATE_KEY_PATH,
'CERT_SERIAL_NO': _secrets.WECHAT_PAY_V3_CERT_SERIAL_NO,
'PLATFORM_CERT_DIR': _secrets.WECHAT_PAY_V3_PLATFORM_CERT_DIR,
'NOTIFY_URL': 'https://www.abas.asia/hqhd/yonghu/tixiancallback',
'TRANSFER_SCENE_ID': '1005',
}
CROSS_PLATFORM_SYNC_TOKEN = _secrets.CROSS_PLATFORM_SYNC_TOKEN