""" 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