From 99207cac3b3d3492792886f350f9aa2afd53f4a5 Mon Sep 17 00:00:00 2001 From: zhangtao <9480807882@qq.com> Date: Mon, 27 Jan 2025 19:12:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/config/.env.dev | 71 ++++--------------------- backend/app/config/.env.prod | 75 ++++----------------------- backend/app/config/.env.test | 71 ++++--------------------- backend/app/config/setting.py | 94 ++++++++++++++++++---------------- backend/dev_sql.db | Bin 450560 -> 450560 bytes 5 files changed, 78 insertions(+), 233 deletions(-) diff --git a/backend/app/config/.env.dev b/backend/app/config/.env.dev index 715f153b..64321d4e 100644 --- a/backend/app/config/.env.dev +++ b/backend/app/config/.env.dev @@ -26,88 +26,35 @@ DOCS_URL = "/docs" # Swagger UI路径 REDOC_URL = "/redoc" # ReDoc路径 ROOT_PATH = "/api/v1" # API路由前缀 -# JWT配置 -SECRET_KEY = "vgb0tnl9d58+6n-6h-ea&u^1#s0ccp!794=krylxcjq75vzps$" # JWT密钥 -ALGORITHM = "HS256" # JWT算法 -ACCESS_TOKEN_EXPIRE_MINUTES = 1440 # access_token过期时间(分钟) -REFRESH_TOKEN_EXPIRE_MINUTES = 10080 # refresh_token过期时间(分钟) -TOKEN_TYPE = "bearer" # token类型 -JWT_REDIS_EXPIRE_MINUTES = 30 # redis缓存过期时间(分钟) - - # 数据库配置 -DATABASE_ECHO = False # 是否显示SQL日志 -ECHO_POOL = False # 是否显示连接池日志 -POOL_SIZE = 20 # 连接池大小 -MAX_OVERFLOW = 10 # 最大溢出连接数 -POOL_TIMEOUT = 30 # 连接超时时间(秒) -POOL_RECYCLE = 1800 # 连接回收时间(秒) -POOL_PRE_PING = True # 是否开启连接预检 -FUTURE = True # 是否使用SQLAlchemy 2.0特性 -AUTOCOMMIT = False # 是否自动提交 -AUTOFETCH = False # 是否自动获取 -EXPIRE_ON_COMMIT = False # 是否在提交时过期 DB_DRIVER = "sqlite" # sqlite、mysql、postgresql # SQLite配置 SQLITE_DB_NAME = "dev_sql.db" -# Redis配置 -REDIS_ENABLE = True -REDIS_HOST = "localhost" -REDIS_PORT = 6379 -REDIS_DB = 1 - # MYSQL配置 -SQL_DB_ENABLE = True # 是否启用数据库 +MYSQL_HOST = "localhost" MYSQL_USER = "root" MYSQL_PASSWORD = 123456 -MYSQL_HOST = "localhost" MYSQL_PORT = 3306 MYSQL_DB_NAME = "fastapi_vue_admin" # PostgreSQL配置 +POSTGRESQL_HOST = "localhost" POSTGRESQL_USER = "postgres" POSTGRESQL_PASSWORD = 123456 -POSTGRESQL_HOST = "localhost" POSTGRESQL_PORT = 5432 POSTGRESQL_DB_NAME = "fastapi_vue_admin" +# Redis配置 +REDIS_HOST = "localhost" +REDIS_PORT = 6379 +REDIS_DB = 1 + # MongoDB配置 -MONGO_DB_ENABLE = True -MONGO_DB_NAME = "fastapi_vue_admin" MONGO_DB_HOST = "localhost" MONGO_DB_PORT = 27017 +MONGO_DB_NAME = "fastapi_vue_admin" # 日志配置 -BACKUPCOUNT = 10 # 日志文件备份数 -WHEN = 'MIDNIGHT' # 日志分割时间 -INTERVAL = 1 # 日志分割间隔 -ENCODING = 'utf-8' # 日志编码 -LOGGER_LEVEL = 'INFO' # 日志级别 -LOGGER_FORMAT = '%(asctime)s - %(levelname)s - [%(name)s:%(filename)s:%(funcName)s:%(lineno)d] %(message)s' # 日志格式 - -# 请求中间件配置 -OPERATION_LOG_RECORD = True # 是否记录操作日志 -OPERATION_RECORD_METHOD = ["POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] # 需要记录的请求方法 -IGNORE_OPERATION_FUNCTION = ["get_captcha_for_login"] # 忽略记录的函数 - -# 跨域中间件配置 -CORS_ORIGIN_ENABLE = True # 是否启用跨域 -ALLOW_ORIGINS = ["*"] # 允许的域名列表 -ALLOW_METHODS = ["*"] # 允许的HTTP方法 -ALLOW_HEADERS = ["*"] # 允许的请求头 -ALLOW_CREDENTIALS = True # 是否允许携带cookie - -# Gzip压缩中间件配置 -GZIP_ENABLE = True # 是否启用Gzip -GZIP_MIN_SIZE = 1000 # 最小压缩大小(字节) -GZIP_COMPRESS_LEVEL = 9 # 压缩级别(1-9) - -# 验证码配置 -CAPTCHA_ENABLE = True # 是否启用验证码 -CAPTCHA_EXPIRE_SECONDS = 60 # 验证码过期时间(秒) -CAPTCHA_FONT_SIZE = 40 # 字体大小 - -# 上传配置 -MAX_FILE_SIZE = 10485760 # 最大文件大小10 * 1024 * 1024(10MB) +LOGGER_LEVEL = 'DEBUG' # 日志级别 diff --git a/backend/app/config/.env.prod b/backend/app/config/.env.prod index b6ae2c36..f4e757d4 100644 --- a/backend/app/config/.env.prod +++ b/backend/app/config/.env.prod @@ -7,7 +7,7 @@ ENVIRONMENT = "prod" # 服务器配置 SERVER_HOST = 'localhost' # 允许访问的IP地址 SERVER_PORT = 8000 # 服务端口 -RELOAD = True # 是否自动重启 +RELOAD = False # 是否自动重启 WORKERS = 1 # 启动进程数 FACTORY = True # 是否使用异步模式 LIMIT_CONCURRENCY = 1000 # 最大并发连接数 @@ -17,7 +17,7 @@ TIMEOUT_KEEP_ALIVE = 5 # 保持连接时间(秒) LIFESPAN = "on" # 生命周期模式 # 文档配置 -DEBUG = True # 调试模式 +DEBUG = False # 调试模式 TITLE = "🎉 Fastapi Vue Admin 🎉 -prod" # 文档标题 VERSION = '0.1.0' # 版本号 DESCRIPTION = "该项目是一个基于python的web服务框架,基于fastapi和sqlalchemy实现。" # 文档描述 @@ -26,88 +26,35 @@ DOCS_URL = "/docs" # Swagger UI路径 REDOC_URL = "/redoc" # ReDoc路径 ROOT_PATH = "/api/v1" # API路由前缀 -# JWT配置 -SECRET_KEY = "vgb0tnl9d58+6n-6h-ea&u^1#s0ccp!794=krylxcjq75vzps$" # JWT密钥 -ALGORITHM = "HS256" # JWT算法 -ACCESS_TOKEN_EXPIRE_MINUTES = 1440 # access_token过期时间(分钟) -REFRESH_TOKEN_EXPIRE_MINUTES = 10080 # refresh_token过期时间(分钟) -TOKEN_TYPE = "bearer" # token类型 -JWT_REDIS_EXPIRE_MINUTES = 30 # redis缓存过期时间(分钟) - - # 数据库配置 -DATABASE_ECHO = False # 是否显示SQL日志 -ECHO_POOL = False # 是否显示连接池日志 -POOL_SIZE = 20 # 连接池大小 -MAX_OVERFLOW = 10 # 最大溢出连接数 -POOL_TIMEOUT = 30 # 连接超时时间(秒) -POOL_RECYCLE = 1800 # 连接回收时间(秒) -POOL_PRE_PING = True # 是否开启连接预检 -FUTURE = True # 是否使用SQLAlchemy 2.0特性 -AUTOCOMMIT = False # 是否自动提交 -AUTOFETCH = False # 是否自动获取 -EXPIRE_ON_COMMIT = False # 是否在提交时过期 -DB_DRIVER = "sqlite" # sqlite、mysql、postgresql +DB_DRIVER = "mysql" # sqlite、mysql、postgresql # SQLite配置 SQLITE_DB_NAME = "dev_sql.db" -# Redis配置 -REDIS_ENABLE = True -REDIS_HOST = "localhost" -REDIS_PORT = 6379 -REDIS_DB = 1 - # MYSQL配置 -SQL_DB_ENABLE = True # 是否启用数据库 +MYSQL_HOST = "localhost" MYSQL_USER = "root" MYSQL_PASSWORD = 123456 -MYSQL_HOST = "localhost" MYSQL_PORT = 3306 MYSQL_DB_NAME = "fastapi_vue_admin" # PostgreSQL配置 +POSTGRESQL_HOST = "localhost" POSTGRESQL_USER = "postgres" POSTGRESQL_PASSWORD = 123456 -POSTGRESQL_HOST = "localhost" POSTGRESQL_PORT = 5432 POSTGRESQL_DB_NAME = "fastapi_vue_admin" +# Redis配置 +REDIS_HOST = "localhost" +REDIS_PORT = 6379 +REDIS_DB = 1 + # MongoDB配置 -MONGO_DB_ENABLE = True -MONGO_DB_NAME = "fastapi_vue_admin" MONGO_DB_HOST = "localhost" MONGO_DB_PORT = 27017 +MONGO_DB_NAME = "fastapi_vue_admin" # 日志配置 -BACKUPCOUNT = 10 # 日志文件备份数 -WHEN = 'MIDNIGHT' # 日志分割时间 -INTERVAL = 1 # 日志分割间隔 -ENCODING = 'utf-8' # 日志编码 LOGGER_LEVEL = 'INFO' # 日志级别 -LOGGER_FORMAT = '%(asctime)s - %(levelname)s - [%(name)s:%(filename)s:%(funcName)s:%(lineno)d] %(message)s' # 日志格式 - -# 请求中间件配置 -OPERATION_LOG_RECORD = True # 是否记录操作日志 -OPERATION_RECORD_METHOD = ["POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] # 需要记录的请求方法 -IGNORE_OPERATION_FUNCTION = ["get_captcha_for_login"] # 忽略记录的函数 - -# 跨域中间件配置 -CORS_ORIGIN_ENABLE = True # 是否启用跨域 -ALLOW_ORIGINS = ["*"] # 允许的域名列表 -ALLOW_METHODS = ["*"] # 允许的HTTP方法 -ALLOW_HEADERS = ["*"] # 允许的请求头 -ALLOW_CREDENTIALS = True # 是否允许携带cookie - -# Gzip压缩中间件配置 -GZIP_ENABLE = True # 是否启用Gzip -GZIP_MIN_SIZE = 1000 # 最小压缩大小(字节) -GZIP_COMPRESS_LEVEL = 9 # 压缩级别(1-9) - -# 验证码配置 -CAPTCHA_ENABLE = True # 是否启用验证码 -CAPTCHA_EXPIRE_SECONDS = 60 # 验证码过期时间(秒) -CAPTCHA_FONT_SIZE = 40 # 字体大小 - -# 上传配置 -MAX_FILE_SIZE = 10485760 # 最大文件大小10 * 1024 * 1024(10MB) diff --git a/backend/app/config/.env.test b/backend/app/config/.env.test index ef649ce6..00d7a7d6 100644 --- a/backend/app/config/.env.test +++ b/backend/app/config/.env.test @@ -26,88 +26,35 @@ DOCS_URL = "/docs" # Swagger UI路径 REDOC_URL = "/redoc" # ReDoc路径 ROOT_PATH = "/api/v1" # API路由前缀 -# JWT配置 -SECRET_KEY = "vgb0tnl9d58+6n-6h-ea&u^1#s0ccp!794=krylxcjq75vzps$" # JWT密钥 -ALGORITHM = "HS256" # JWT算法 -ACCESS_TOKEN_EXPIRE_MINUTES = 1440 # access_token过期时间(分钟) -REFRESH_TOKEN_EXPIRE_MINUTES = 10080 # refresh_token过期时间(分钟) -TOKEN_TYPE = "bearer" # token类型 -JWT_REDIS_EXPIRE_MINUTES = 30 # redis缓存过期时间(分钟) - - # 数据库配置 -DATABASE_ECHO = False # 是否显示SQL日志 -ECHO_POOL = False # 是否显示连接池日志 -POOL_SIZE = 20 # 连接池大小 -MAX_OVERFLOW = 10 # 最大溢出连接数 -POOL_TIMEOUT = 30 # 连接超时时间(秒) -POOL_RECYCLE = 1800 # 连接回收时间(秒) -POOL_PRE_PING = True # 是否开启连接预检 -FUTURE = True # 是否使用SQLAlchemy 2.0特性 -AUTOCOMMIT = False # 是否自动提交 -AUTOFETCH = False # 是否自动获取 -EXPIRE_ON_COMMIT = False # 是否在提交时过期 DB_DRIVER = "sqlite" # sqlite、mysql、postgresql # SQLite配置 SQLITE_DB_NAME = "dev_sql.db" -# Redis配置 -REDIS_ENABLE = True -REDIS_HOST = "localhost" -REDIS_PORT = 6379 -REDIS_DB = 1 - # MYSQL配置 -SQL_DB_ENABLE = True # 是否启用数据库 +MYSQL_HOST = "localhost" MYSQL_USER = "root" MYSQL_PASSWORD = 123456 -MYSQL_HOST = "localhost" MYSQL_PORT = 3306 MYSQL_DB_NAME = "fastapi_vue_admin" # PostgreSQL配置 +POSTGRESQL_HOST = "localhost" POSTGRESQL_USER = "postgres" POSTGRESQL_PASSWORD = 123456 -POSTGRESQL_HOST = "localhost" POSTGRESQL_PORT = 5432 POSTGRESQL_DB_NAME = "fastapi_vue_admin" +# Redis配置 +REDIS_HOST = "localhost" +REDIS_PORT = 6379 +REDIS_DB = 1 + # MongoDB配置 -MONGO_DB_ENABLE = True -MONGO_DB_NAME = "fastapi_vue_admin" MONGO_DB_HOST = "localhost" +MONGO_DB_NAME = "fastapi_vue_admin" MONGO_DB_PORT = 27017 # 日志配置 -BACKUPCOUNT = 10 # 日志文件备份数 -WHEN = 'MIDNIGHT' # 日志分割时间 -INTERVAL = 1 # 日志分割间隔 -ENCODING = 'utf-8' # 日志编码 -LOGGER_LEVEL = 'INFO' # 日志级别 -LOGGER_FORMAT = '%(asctime)s - %(levelname)s - [%(name)s:%(filename)s:%(funcName)s:%(lineno)d] %(message)s' # 日志格式 - -# 请求中间件配置 -OPERATION_LOG_RECORD = True # 是否记录操作日志 -OPERATION_RECORD_METHOD = ["POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] # 需要记录的请求方法 -IGNORE_OPERATION_FUNCTION = ["get_captcha_for_login"] # 忽略记录的函数 - -# 跨域中间件配置 -CORS_ORIGIN_ENABLE = True # 是否启用跨域 -ALLOW_ORIGINS = ["*"] # 允许的域名列表 -ALLOW_METHODS = ["*"] # 允许的HTTP方法 -ALLOW_HEADERS = ["*"] # 允许的请求头 -ALLOW_CREDENTIALS = True # 是否允许携带cookie - -# Gzip压缩中间件配置 -GZIP_ENABLE = True # 是否启用Gzip -GZIP_MIN_SIZE = 1000 # 最小压缩大小(字节) -GZIP_COMPRESS_LEVEL = 9 # 压缩级别(1-9) - -# 验证码配置 -CAPTCHA_ENABLE = True # 是否启用验证码 -CAPTCHA_EXPIRE_SECONDS = 60 # 验证码过期时间(秒) -CAPTCHA_FONT_SIZE = 40 # 字体大小 - -# 上传配置 -MAX_FILE_SIZE = 10485760 # 最大文件大小10 * 1024 * 1024(10MB) +LOGGER_LEVEL = 'DEBUG' # 日志级别 diff --git a/backend/app/config/setting.py b/backend/app/config/setting.py index 6cc7e213..9e5a22e9 100755 --- a/backend/app/config/setting.py +++ b/backend/app/config/setting.py @@ -5,7 +5,7 @@ from datetime import date from functools import lru_cache from pathlib import Path from typing import Any, ClassVar, Dict, List, Optional, Union, Literal -from pydantic import MongoDsn, RedisDsn +from pydantic import MongoDsn, PostgresDsn, RedisDsn, MySQLDsn from pydantic_settings import BaseSettings, SettingsConfigDict from uvicorn.config import LifespanType @@ -67,37 +67,38 @@ class Settings(BaseSettings): # ================================================= # # ******************** 跨域配置 ******************** # # ================================================= # - CORS_ORIGIN_ENABLE: bool # 是否启用跨域 - ALLOW_ORIGINS: List[str] # 允许的域名列表 - ALLOW_METHODS: List[str] # 允许的HTTP方法 - ALLOW_HEADERS: List[str] # 允许的请求头 - ALLOW_CREDENTIALS: bool # 是否允许携带cookie + CORS_ORIGIN_ENABLE: bool = True # 是否启用跨域 + ALLOW_ORIGINS: List[str] = ["*"] # 允许的域名列表 + ALLOW_METHODS: List[str] = ["*"] # 允许的HTTP方法 + ALLOW_HEADERS: List[str] = ["*"] # 允许的请求头 + ALLOW_CREDENTIALS: bool = True # 是否允许携带cookie # ================================================= # # ******************* 登录认证配置 ****************** # # ================================================= # - SECRET_KEY: str # JWT密钥 - ALGORITHM: str # JWT算法 - ACCESS_TOKEN_EXPIRE_MINUTES: int # access_token过期时间(分钟) - REFRESH_TOKEN_EXPIRE_MINUTES: int # refresh_token过期时间(分钟) - TOKEN_TYPE: str # token类型 - JWT_REDIS_EXPIRE_MINUTES: int # redis缓存过期时间(分钟) + SECRET_KEY: str = "vgb0tnl9d58+6n-6h-ea&u^1#s0ccp!794=krylxcjq75vzps$" # JWT密钥 + ALGORITHM: str = "HS256" # JWT算法 + ACCESS_TOKEN_EXPIRE_MINUTES: int = 1440 # access_token过期时间(分钟) + REFRESH_TOKEN_EXPIRE_MINUTES: int = 10080 # refresh_token过期时间(分钟) + TOKEN_TYPE: str = "bearer" # token类型 + JWT_REDIS_EXPIRE_MINUTES: int = 30 # redis缓存过期时间(分钟) # ================================================= # # ******************** 数据库配置 ******************* # # ================================================= # - SQL_DB_ENABLE: bool # 是否启用数据库 - DATABASE_ECHO: bool # 是否显示SQL日志 - ECHO_POOL: bool # 是否显示连接池日志 - POOL_SIZE: int # 连接池大小 - MAX_OVERFLOW: int # 最大溢出连接数 - POOL_TIMEOUT: int # 连接超时时间(秒) - POOL_RECYCLE: int # 连接回收时间(秒) - POOL_PRE_PING: bool # 是否开启连接预检 - FUTURE: bool # 是否使用SQLAlchemy 2.0特性 - AUTOCOMMIT: bool # 是否自动提交 - AUTOFETCH: bool # 是否自动获取 - EXPIRE_ON_COMMIT: bool # 是否在提交时过期 + SQL_DB_ENABLE: bool = True # 是否启用数据库 + DATABASE_ECHO: bool = False # 是否显示SQL日志 + ECHO_POOL: bool = False # 是否显示连接池日志 + POOL_SIZE: int = 20 # 连接池大小 + MAX_OVERFLOW: int = 10 # 最大溢出连接数 + POOL_TIMEOUT: int = 30 # 连接超时时间(秒) + POOL_RECYCLE: int = 1800 # 连接回收时间(秒) + POOL_PRE_PING: bool = True # 是否开启连接预检 + FUTURE: bool = True # 是否使用SQLAlchemy 2.0特性 + AUTOCOMMIT: bool = False # 是否自动提交 + AUTOFETCH: bool = False # 是否自动获取 + EXPIRE_ON_COMMIT: bool = False # 是否在提交时过期 + # SQLite数据库连接 DB_DRIVER: str SQLITE_DB_NAME: str @@ -119,7 +120,7 @@ class Settings(BaseSettings): # ================================================= # # ******************** MongoDB配置 ******************* # # ================================================= # - MONGO_DB_ENABLE: bool # 是否启用MongoDB + MONGO_DB_ENABLE: bool = True # 是否启用MongoDB MONGO_DB_HOST: str MONGO_DB_PORT: int MONGO_DB_NAME: str @@ -127,7 +128,7 @@ class Settings(BaseSettings): # ================================================= # # ******************** Redis配置 ******************* # # ================================================= # - REDIS_ENABLE: bool # 是否启用Redis + REDIS_ENABLE: bool = True # 是否启用Redis REDIS_HOST: str REDIS_PORT: int REDIS_DB: int @@ -135,32 +136,32 @@ class Settings(BaseSettings): # ================================================= # # ******************** 验证码配置 ******************* # # ================================================= # - CAPTCHA_ENABLE: bool # 是否启用验证码 - CAPTCHA_EXPIRE_SECONDS: int # 验证码过期时间(秒) - CAPTCHA_FONT_SIZE: int # 字体大小 + CAPTCHA_ENABLE: bool = True # 是否启用验证码 + CAPTCHA_EXPIRE_SECONDS: int = 60 # 验证码过期时间(秒) + CAPTCHA_FONT_SIZE: int = 40 # 字体大小 CAPTCHA_FONT_PATH: Path = 'static/assets/font/Arial.ttf' # 字体路径 # ================================================= # # ********************* 日志配置 ******************* # # ================================================= # + LOGGER_LEVEL: str # 日志级别 LOGGER_NAME: str = date.today().strftime(r'%Y-%m-%d.log') # 日志文件名 LOGGER_FILEPATH: Path = BASE_DIR.joinpath('logs', LOGGER_NAME) # 日志文件路径 - BACKUPCOUNT: int # 日志文件备份数 - WHEN: str # 日志分割时间 - INTERVAL: int # 日志分割间隔 - ENCODING: str # 日志编码 - LOGGER_LEVEL: str # 日志级别 - LOGGER_FORMAT: str # 日志格式 - OPERATION_LOG_RECORD: bool # 是否记录操作日志 - OPERATION_RECORD_METHOD: List[str] # 需要记录的请求方法 - IGNORE_OPERATION_FUNCTION: List[str] # 忽略记录的函数 + BACKUPCOUNT: int = 10 # 日志文件备份数 + WHEN: str = 'MIDNIGHT' # 日志分割时间 + INTERVAL: int = 1 # 日志分割间隔 + ENCODING: str = 'utf-8' # 日志编码 + LOGGER_FORMAT: str = '%(asctime)s - %(levelname)s - [%(name)s:%(filename)s:%(funcName)s:%(lineno)d] %(message)s' # 日志格式 + OPERATION_LOG_RECORD: bool = True # 是否记录操作日志 + OPERATION_RECORD_METHOD: List[str] = ["POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] # 需要记录的请求方法 + IGNORE_OPERATION_FUNCTION: List[str] = ["get_captcha_for_login"] # 忽略记录的函数 # ================================================= # # ******************* Gzip压缩配置 ******************* # # ================================================= # - GZIP_ENABLE: bool # 是否启用Gzip - GZIP_MIN_SIZE: int # 最小压缩大小(字节) - GZIP_COMPRESS_LEVEL: int # 压缩级别(1-9) + GZIP_ENABLE: bool = True # 是否启用Gzip + GZIP_MIN_SIZE: int = 1000 # 最小压缩大小(字节) + GZIP_COMPRESS_LEVEL: int = 9 # 压缩级别(1-9) # ================================================= # # ***************** 演示模型配置 ***************** # @@ -198,7 +199,7 @@ class Settings(BaseSettings): # 视频 '.mp4', '.avi', '.rmvb' ] - MAX_FILE_SIZE: int # 最大文件大小(10MB) + MAX_FILE_SIZE: int = 10 * 1024 * 1024 # 最大文件大小(10MB) # ================================================= # # ***************** Swagger配置 ***************** # @@ -290,11 +291,14 @@ class Settings(BaseSettings): if self.DB_DRIVER not in supported_db_drivers: raise ValueError(f"数据库驱动不支持: {self.DB_DRIVER}, 请选择 {supported_db_drivers}") if self.DB_DRIVER == "sqlite": - return f"sqlite+aiosqlite:///{self.BASE_DIR.joinpath(self.SQLITE_DB_NAME)}?characterEncoding=UTF-8" + SQLITE_URI: str = f"sqlite+aiosqlite:///{self.BASE_DIR.joinpath(self.SQLITE_DB_NAME)}?characterEncoding=UTF-8" + return SQLITE_URI elif self.DB_DRIVER == "mysql": - return f"mysql+asyncmy://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB_NAME}?charset=utf8mb4" + MYSQL_URI: MySQLDsn = f"mysql+asyncmy://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB_NAME}?charset=utf8mb4" + return MYSQL_URI else: - return f"postgresql+asyncpg://{self.POSTGRESQL_USER}:{self.POSTGRESQL_PASSWORD}@{self.POSTGRESQL_HOST}:{self.POSTGRESQL_PORT}/{self.POSTGRESQL_DB_NAME}" + POSRGRES_URI: PostgresDsn = f"postgresql+asyncpg://{self.POSTGRESQL_USER}:{self.POSTGRESQL_PASSWORD}@{self.POSTGRESQL_HOST}:{self.POSTGRESQL_PORT}/{self.POSTGRESQL_DB_NAME}" + return POSRGRES_URI @property def get_redis_uri(self) -> RedisDsn: diff --git a/backend/dev_sql.db b/backend/dev_sql.db index 8a3e85673376b0e2c3ea0b52658b6bdf62d2c839..0d70c8d508c4b8a767f60f827e965eb56557c533 100644 GIT binary patch delta 7446 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 Un*Au^zH^y+=Q6NonR)&H0(@vH-2eap