""" Django settings for a_long_dianjing project. """ from pathlib import Path from datetime import timedelta import os # 从密钥配置文件导入敏感信息 try: import app_secrets except ImportError: raise ImportError("缺少 appapp_secrets.py 密钥配置文件,请参照项目说明创建") BASE_DIR = Path(__file__).resolve().parent.parent SECRET_KEY = app_secrets.SECRET_KEY DEBUG = False ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'www.abas.asia'] # ==================== 应用配置 ==================== INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'rest_framework_simplejwt', 'corsheaders', 'django_celery_results', 'celery', 'yonghu', 'dingdan', 'shangpin', 'peizhi', 'houtai', 'utils', 'shangdian', 'dengji', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', '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 = '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' # ==================== 数据库 ==================== DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': app_secrets.DATABASE_NAME, 'USER': app_secrets.DATABASE_USER, 'HOST': app_secrets.DATABASE_HOST, 'PASSWORD': app_secrets.DATABASE_PASSWORD, 'PORT': app_secrets.DATABASE_PORT, 'OPTIONS': { 'charset': 'utf8mb4', 'init_command': "SET time_zone='+08:00'", } } } # ==================== 密码验证 ==================== 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'}, ] # ==================== 国际化 ==================== LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_TZ = False STATIC_URL = 'static/' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # ==================== 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', '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', ] 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', 'user': '1000/minute', }, 'EXCEPTION_HANDLER': 'utils.exception_handler.custom_exception_handler', 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', ], } # ==================== H5 域名 ==================== H5_DOMAIN = 'https://www.abas.asia:666' # ==================== CORS 配置 ==================== CORS_ALLOWED_ORIGINS = [ "http://localhost:8080", "http://127.0.0.1:8080", "https://www.abas.asia", "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", ] 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", ] # ==================== 腾讯云 COS ==================== COS_SECRET_ID = app_secrets.COS_SECRET_ID COS_SECRET_KEY = app_secrets.COS_SECRET_KEY COS_REGION = app_secrets.COS_REGION COS_BUCKET = app_secrets.COS_BUCKET COS_SCHEME = 'https' COS_DOMAIN = f'https://{COS_BUCKET}.cos.{COS_REGION}.myqcloud.com' COS_APPID = app_secrets.COS_APPID COS_STS_DURATION = 7200 # ==================== 微信小程序 & 服务号 ==================== WEIXIN_APPID = app_secrets.WEIXIN_APPID WEIXIN_SECRET = app_secrets.WEIXIN_SECRET WEIXIN_MCHID = app_secrets.WEIXIN_MCHID WEIXIN_SHANGHUMIYAO = app_secrets.WEIXIN_SHANGHUMIYAO WEIXIN_OFFICIAL_APPID = app_secrets.WEIXIN_OFFICIAL_APPID WEIXIN_OFFICIAL_SECRET = app_secrets.WEIXIN_OFFICIAL_SECRET WEIXIN_OFFICIAL_TOKEN = app_secrets.WEIXIN_OFFICIAL_TOKEN WEIXIN_OFFICIAL_ENCODING_AES_KEY = app_secrets.WEIXIN_OFFICIAL_ENCODING_AES_KEY WEIXIN_TEMPLATE_ID = app_secrets.WEIXIN_TEMPLATE_ID WEIXIN_TEMPLATE_MAX_PER_MINUTE = 950 WEIXIN_TEMPLATE_BATCH_SIZE = 100 WEIXIN_CERT_PATH = app_secrets.WEIXIN_CERT_PATH WEIXIN_KEY_PATH = app_secrets.WEIXIN_KEY_PATH # ==================== 微信支付回调地址 ==================== WEIXIN_NOTIFY_URL = 'https://www.abas.asia/hqhd/dingdan/pay-notify/' 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 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', } # ==================== GoEasy IM ==================== GOEASY_APPKEY = app_secrets.GOEASY_APPKEY GOEASY_SECRET = app_secrets.GOEASY_SECRET GOEASY_REST_URL = 'https://rest-hz.goeasy.io/v2/im/message' # ==================== Celery 配置 ==================== REDIS_HOST = app_secrets.REDIS_HOST REDIS_PORT = app_secrets.REDIS_PORT REDIS_PASSWORD = app_secrets.REDIS_PASSWORD REDIS_DB_CELERY = app_secrets.REDIS_DB_CELERY REDIS_DB_RESULT = app_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': {} } } 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 CELERY_IMPORTS = ('dingdan.tongzhi_tasks',) CELERY_TASK_TIME_LIMIT = 300 CELERY_TASK_SOFT_TIME_LIMIT = 240 CELERY_WORKER_CONCURRENCY = 4 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'}, } # ==================== 定时任务时间配置 ==================== ORDER_EXPIRE_SECONDS = 48 * 60 * 60 # 48小时 = 172800秒 DAILY_TASK_HOUR = 0 DAILY_TASK_MINUTE = 30 MONTHLY_TASK_DAY = 1 MONTHLY_TASK_HOUR = 0 MONTHLY_TASK_MINUTE = 0 ORDER_CHECK_INTERVAL = 5 # ==================== 跨平台订单互通 ==================== CROSS_PLATFORM_TOKEN = app_secrets.CROSS_PLATFORM_TOKEN CROSS_PLATFORM_SYNC_TOKEN = app_secrets.CROSS_PLATFORM_SYNC_TOKEN PARTNER_BASE_URL = app_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 = app_secrets.AGENT_SHANGJIA_ID CROSS_PLATFORM_MEMBER_ID = app_secrets.CROSS_PLATFORM_MEMBER_ID CROSS_PLATFORM_GAME_TYPE_ID = 1 CROSS_PLATFORM_WHITELIST = app_secrets.CROSS_PLATFORM_WHITELIST SPECIAL_GUANSHI_IDS = app_secrets.SPECIAL_GUANSHI_IDS # ==================== 微信支付 V3 ==================== WECHAT_PAY_V3_CONFIG = { 'MCHID': app_secrets.WECHAT_PAY_V3_MCHID, 'APPID': app_secrets.WECHAT_PAY_V3_APPID, 'API_V3_KEY': app_secrets.WECHAT_PAY_V3_API_V3_KEY, 'PRIVATE_KEY_PATH': app_secrets.WECHAT_PAY_V3_PRIVATE_KEY_PATH, 'CERT_SERIAL_NO': app_secrets.WECHAT_PAY_V3_CERT_SERIAL_NO, 'PLATFORM_CERT_DIR': app_secrets.WECHAT_PAY_V3_PLATFORM_CERT_DIR, 'NOTIFY_URL': 'https://www.abas.asia/hqhd/yonghu/tixiancallback', 'TRANSFER_SCENE_ID': '1005', }