from pathlib import Path import os from dotenv import load_dotenv BASE_DIR = Path(__file__).resolve().parents[2] load_dotenv(BASE_DIR / ".env") def env(name: str, default: str | None = None) -> str | None: return os.getenv(name, default) def env_bool(name: str, default: bool = False) -> bool: value = os.getenv(name) if value is None: return default return value.lower() in {"1", "true", "yes", "on"} def env_list(name: str, default: str = "") -> list[str]: value = os.getenv(name, default) return [item.strip() for item in value.split(",") if item.strip()] SECRET_KEY = env("DJANGO_SECRET_KEY", "airshelf-dev-insecure-key") DEBUG = env_bool("DJANGO_DEBUG", False) ALLOWED_HOSTS = env_list("DJANGO_ALLOWED_HOSTS", "localhost,127.0.0.1") CSRF_TRUSTED_ORIGINS = env_list("DJANGO_CSRF_TRUSTED_ORIGINS") INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "rest_framework", "rest_framework.authtoken", "corsheaders", "apps.common", "apps.accounts", "apps.assets", "apps.products", "apps.projects", "apps.ai", "apps.billing", "apps.ops", ] MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "corsheaders.middleware.CorsMiddleware", "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 = "airshelf.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "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", ], }, } ] WSGI_APPLICATION = "airshelf.wsgi.application" ASGI_APPLICATION = "airshelf.asgi.application" if env("DB_ENGINE", "sqlite") == "mysql": mysql_options = { "charset": "utf8mb4", "init_command": "SET sql_mode='STRICT_TRANS_TABLES'", } if env("DB_BIND_ADDRESS"): mysql_options["bind_address"] = env("DB_BIND_ADDRESS") DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": env("DB_NAME", "airshelf"), "USER": env("DB_USER", "airshelf"), "PASSWORD": env("DB_PASSWORD", ""), "HOST": env("DB_HOST", "127.0.0.1"), "PORT": env("DB_PORT", "3306"), "OPTIONS": mysql_options, } } else: DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": BASE_DIR / "db.sqlite3", } } AUTH_USER_MODEL = "accounts.User" 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 = True STATIC_URL = "static/" DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": [ "rest_framework.authentication.TokenAuthentication", "rest_framework.authentication.SessionAuthentication", "rest_framework.authentication.BasicAuthentication", ], "DEFAULT_PERMISSION_CLASSES": [ "rest_framework.permissions.IsAuthenticated", ], "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination", "DEFAULT_FILTER_BACKENDS": [ "rest_framework.filters.SearchFilter", "rest_framework.filters.OrderingFilter", ], "PAGE_SIZE": 20, } CORS_ALLOWED_ORIGINS = env_list("CORS_ALLOWED_ORIGINS") CORS_ALLOW_CREDENTIALS = True CACHES = { "default": { "BACKEND": "django.core.cache.backends.redis.RedisCache", "LOCATION": env("REDIS_CACHE_URL", "redis://127.0.0.1:6379/0"), } } CELERY_BROKER_URL = env("CELERY_BROKER_URL", "redis://127.0.0.1:6379/1") CELERY_RESULT_BACKEND = env("CELERY_RESULT_BACKEND", "redis://127.0.0.1:6379/2") CELERY_TASK_ACKS_LATE = True CELERY_TASK_REJECT_ON_WORKER_LOST = True CELERY_WORKER_PREFETCH_MULTIPLIER = 1 CELERY_TIMEZONE = TIME_ZONE REDIS_LOCK_URL = env("REDIS_LOCK_URL", "redis://127.0.0.1:6379/3") TOS = { "endpoint": env("TOS_ENDPOINT"), "bucket": env("TOS_BUCKET"), "access_key_id": env("TOS_ACCESS_KEY_ID"), "secret_access_key": env("TOS_SECRET_ACCESS_KEY"), } VOLCANO = { "ark_api_key": env("VOLCANO_ARK_API_KEY"), "ark_base_url": env("VOLCANO_ARK_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3"), } DEFAULT_TRIAL_CREDITS = env("DEFAULT_TRIAL_CREDITS", "100.0000")