""" Django settings for item_manager project. Generated by 'django-admin startproject' using Django 5.2.6. For more information on this file, see https://docs.djangoproject.com/en/5.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/5.2/ref/settings/ """ import json import os from pathlib import Path # SECURE 文件用来存储敏感信息,如 SECRET_KEY,SMTP信息 等 # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent with open(Path(__file__).parent / 'secure.json', encoding='utf-8') as f: SECURE = json.load(f) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = SECURE["SECRET_KEY"] # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = ['localhost', '127.0.0.1', '0.0.0.0', '*'] # Application definition INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "rest_framework", "corsheaders", "django_filters", "django_apscheduler", "items", "finance", "email_notice", "personnel", "scheduler", ] 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", "email_notice.middleware.EmailNotificationMiddleware", ] ROOT_URLCONF = "item_manager.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] ASGI_APPLICATION = "item_manager.asgi.application" # Database # https://docs.djangoproject.com/en/5.2/ref/settings/#databases # SQLite 配置 DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": BASE_DIR / "db.sqlite3", } } # 读取数据库配置 # DB_SECURE = SECURE.get("DATABASE", {}) if isinstance(SECURE, dict) else {} # # DATABASES = { # "default": { # "ENGINE": "django.db.backends.mysql", # "NAME": DB_SECURE.get("NAME"), # "USER": DB_SECURE.get("USER"), # "PASSWORD": DB_SECURE.get("PASSWORD"), # "HOST": DB_SECURE.get("HOST"), # "PORT": DB_SECURE.get("PORT"), # } # } # Password validation # https://docs.djangoproject.com/en/5.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", }, ] # REST Framework configuration REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES": [ "rest_framework.permissions.AllowAny", ], "DEFAULT_AUTHENTICATION_CLASSES": [ "rest_framework.authentication.SessionAuthentication", ], } # CORS settings CORS_ALLOWED_ORIGINS = [ "http://localhost:8080", "http://127.0.0.1:8080", "http://localhost:3000", ] CORS_ALLOW_ALL_ORIGINS = True # Internationalization # https://docs.djangoproject.com/en/5.2/topics/i18n/ LANGUAGE_CODE = "zh-hans" TIME_ZONE = "Asia/Shanghai" USE_I18N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.2/howto/static-files/ STATIC_URL = "static/" STATIC_ROOT = BASE_DIR / "staticfiles" MEDIA_URL = "/media/" MEDIA_ROOT = BASE_DIR / "media" # 安全设置(生产环境) SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SECURE_SSL_REDIRECT = False # 如果使用HTTPS,设置为True USE_X_FORWARDED_HOST = True USE_X_FORWARDED_PORT = True # Email settings EMAIL_HOST = SECURE["SMTP"]["EMAIL_HOST"] EMAIL_PORT = SECURE["SMTP"]["EMAIL_PORT"] EMAIL_HOST_USER = SECURE["SMTP"]["EMAIL_HOST_USER"] EMAIL_HOST_PASSWORD = SECURE["SMTP"]["EMAIL_HOST_PASSWORD"] EMAIL_USE_SSL = SECURE["SMTP"]["EMAIL_USE_SSL"] DEFAULT_FROM_EMAIL = SECURE["SMTP"]["DEFAULT_FROM_EMAIL"] ADMINS = SECURE["SMTP"]["ADMINS"] # Default primary key field type # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # 确保日志目录存在 LOGS_DIR = BASE_DIR / 'logs' if not os.path.exists(LOGS_DIR): os.makedirs(LOGS_DIR) # 日志配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}', 'style': '{', }, 'simple': { 'format': '{levelname} {message}', 'style': '{', }, }, 'handlers': { 'file': { 'level': 'INFO', 'class': 'logging.FileHandler', 'filename': LOGS_DIR / 'scheduler.log', 'formatter': 'verbose', }, 'console': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'simple', }, }, 'loggers': { 'scheduler': { 'handlers': ['file', 'console'], 'level': 'INFO', 'propagate': True, }, }, }