mirror of
https://github.com/ijaric/voice_assistant.git
synced 2025-05-24 14:33:26 +00:00
[#10] add split settings
This commit is contained in:
parent
dc4a15a254
commit
5dd8e98a37
|
@ -10,7 +10,7 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
app_instance = app_module.Application()
|
app_instance = app_module.Application()
|
||||||
app = app_instance.create_app()
|
app = app_instance.create_app()
|
||||||
settings = app_settings.get_settings()
|
settings = app_settings.settings
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -1,18 +1,15 @@
|
||||||
import logging
|
import logging
|
||||||
import logging.config as logging_config
|
|
||||||
|
|
||||||
import fastapi
|
import fastapi
|
||||||
|
|
||||||
from .logger import LOGGING
|
import lib.app.settings as app_settings
|
||||||
from .settings import get_settings
|
|
||||||
|
|
||||||
logging_config.dictConfig(LOGGING)
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Application:
|
class Application:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.settings = get_settings()
|
self.settings = app_settings
|
||||||
self.logger = logging.getLogger(__name__)
|
self.logger = logging.getLogger(__name__)
|
||||||
self.producer = None
|
self.producer = None
|
||||||
|
|
||||||
|
|
|
@ -1,35 +1,26 @@
|
||||||
import functools
|
import logging.config as logging_config
|
||||||
|
|
||||||
import pydantic
|
import pydantic
|
||||||
import pydantic_settings
|
import pydantic_settings
|
||||||
|
|
||||||
|
import lib.app.split_settings as app_split_settings
|
||||||
class DbSettings(pydantic_settings.BaseSettings):
|
|
||||||
host: str = pydantic.Field("127.0.0.1", validation_alias="db_host")
|
|
||||||
port: int = pydantic.Field(5432, validation_alias="db_port")
|
|
||||||
user: str = pydantic.Field(..., validation_alias="db_user")
|
|
||||||
password: str = pydantic.Field(..., validation_alias="db_password")
|
|
||||||
name: str = pydantic.Field("db_name", validation_alias="db_name")
|
|
||||||
|
|
||||||
|
|
||||||
class ApiSettings(pydantic_settings.BaseSettings):
|
|
||||||
host: str = pydantic.Field("0.0.0.0", validation_alias="server_host")
|
|
||||||
port: int = pydantic.Field(8000, validation_alias="server_port")
|
|
||||||
|
|
||||||
|
|
||||||
class Settings(pydantic_settings.BaseSettings):
|
class Settings(pydantic_settings.BaseSettings):
|
||||||
debug: str = pydantic.Field("false", validation_alias="debug")
|
api: app_split_settings.ApiSettings = pydantic.Field(default_factory=lambda: app_split_settings.ApiSettings())
|
||||||
db: DbSettings = pydantic.Field(default_factory=lambda: DbSettings())
|
db: app_split_settings.PostgresSettings = pydantic.Field(
|
||||||
api: ApiSettings = pydantic.Field(default_factory=lambda: ApiSettings())
|
default_factory=lambda: app_split_settings.PostgresSettings()
|
||||||
|
)
|
||||||
jwt_secret_key: str = pydantic.Field(..., validation_alias="jwt_secret_key")
|
logger: app_split_settings.LoggingSettings = pydantic.Field(
|
||||||
|
default_factory=lambda: app_split_settings.LoggingSettings()
|
||||||
@pydantic.field_validator("debug")
|
)
|
||||||
@classmethod
|
project: app_split_settings.ProjectSettings = pydantic.Field(
|
||||||
def validate_debug(cls, v: str) -> bool:
|
default_factory=lambda: app_split_settings.ProjectSettings()
|
||||||
return v.lower() == "true"
|
)
|
||||||
|
|
||||||
|
|
||||||
@functools.lru_cache
|
settings = Settings() # todo Вынести в инициализацию
|
||||||
def get_settings() -> Settings:
|
|
||||||
return Settings()
|
logging_config.dictConfig( # todo Вынести в инициализацию
|
||||||
|
app_split_settings.get_logging_config(**settings.logger.model_dump())
|
||||||
|
)
|
||||||
|
|
11
src/fastapi_app/lib/app/split_settings/__init__.py
Normal file
11
src/fastapi_app/lib/app/split_settings/__init__.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from .logger import *
|
||||||
|
from .postgres import *
|
||||||
|
from .project import *
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"LoggingSettings",
|
||||||
|
"get_logging_config",
|
||||||
|
"PostgresSettings",
|
||||||
|
"ApiSettings",
|
||||||
|
"ProjectSettings",
|
||||||
|
]
|
79
src/fastapi_app/lib/app/split_settings/logger.py
Normal file
79
src/fastapi_app/lib/app/split_settings/logger.py
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
import pydantic_settings
|
||||||
|
|
||||||
|
import lib.app.split_settings.utils as app_split_settings_utils
|
||||||
|
|
||||||
|
|
||||||
|
class LoggingSettings(pydantic_settings.BaseSettings):
|
||||||
|
model_config = pydantic_settings.SettingsConfigDict(
|
||||||
|
env_file=app_split_settings_utils.ENV_PATH, env_file_encoding="utf-8", extra="ignore"
|
||||||
|
)
|
||||||
|
|
||||||
|
log_format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||||
|
log_default_handlers: list[str] = [
|
||||||
|
"console",
|
||||||
|
]
|
||||||
|
|
||||||
|
log_level_handlers: str = "INFO"
|
||||||
|
log_level_loggers: str = "INFO"
|
||||||
|
log_level_root: str = "INFO"
|
||||||
|
|
||||||
|
|
||||||
|
def get_logging_config(
|
||||||
|
log_format: str,
|
||||||
|
log_default_handlers: list[str],
|
||||||
|
log_level_handlers: str,
|
||||||
|
log_level_loggers: str,
|
||||||
|
log_level_root: str,
|
||||||
|
):
|
||||||
|
return {
|
||||||
|
"version": 1,
|
||||||
|
"disable_existing_loggers": False,
|
||||||
|
"formatters": {
|
||||||
|
"verbose": {"format": log_format},
|
||||||
|
"default": {
|
||||||
|
"()": "uvicorn.logging.DefaultFormatter",
|
||||||
|
"fmt": "%(levelprefix)s %(message)s",
|
||||||
|
"use_colors": None,
|
||||||
|
},
|
||||||
|
"access": {
|
||||||
|
"()": "uvicorn.logging.AccessFormatter",
|
||||||
|
"fmt": "%(levelprefix)s %(client_addr)s - '%(request_line)s' %(status_code)s",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"handlers": {
|
||||||
|
"console": {
|
||||||
|
"level": log_level_handlers,
|
||||||
|
"class": "logging.StreamHandler",
|
||||||
|
"formatter": "verbose",
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"formatter": "default",
|
||||||
|
"class": "logging.StreamHandler",
|
||||||
|
"stream": "ext://sys.stdout",
|
||||||
|
},
|
||||||
|
"access": {
|
||||||
|
"formatter": "access",
|
||||||
|
"class": "logging.StreamHandler",
|
||||||
|
"stream": "ext://sys.stdout",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"loggers": {
|
||||||
|
"": {
|
||||||
|
"handlers": log_default_handlers,
|
||||||
|
"level": log_level_loggers,
|
||||||
|
},
|
||||||
|
"uvicorn.error": {
|
||||||
|
"level": log_level_loggers,
|
||||||
|
},
|
||||||
|
"uvicorn.access": {
|
||||||
|
"handlers": ["access"],
|
||||||
|
"level": log_level_loggers,
|
||||||
|
"propagate": False,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"level": log_level_root,
|
||||||
|
"formatter": "verbose",
|
||||||
|
"handlers": log_default_handlers,
|
||||||
|
},
|
||||||
|
}
|
20
src/fastapi_app/lib/app/split_settings/postgres.py
Normal file
20
src/fastapi_app/lib/app/split_settings/postgres.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import pydantic
|
||||||
|
import pydantic_settings
|
||||||
|
|
||||||
|
import lib.app.split_settings.utils as app_split_settings_utils
|
||||||
|
|
||||||
|
|
||||||
|
class PostgresSettings(pydantic_settings.BaseSettings):
|
||||||
|
model_config = pydantic_settings.SettingsConfigDict(
|
||||||
|
env_file=app_split_settings_utils.ENV_PATH,
|
||||||
|
env_prefix="DB_",
|
||||||
|
env_file_encoding="utf-8",
|
||||||
|
extra="ignore",
|
||||||
|
)
|
||||||
|
|
||||||
|
host: str = "localhost"
|
||||||
|
port: int = 5432
|
||||||
|
user: str = "app"
|
||||||
|
password: pydantic.SecretStr = pydantic.Field(
|
||||||
|
default=..., validation_alias=pydantic.AliasChoices("password", "db_password")
|
||||||
|
)
|
31
src/fastapi_app/lib/app/split_settings/project.py
Normal file
31
src/fastapi_app/lib/app/split_settings/project.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import pydantic
|
||||||
|
import pydantic_settings
|
||||||
|
|
||||||
|
import lib.app.split_settings.utils as app_split_settings_utils
|
||||||
|
|
||||||
|
|
||||||
|
class ApiSettings(pydantic_settings.BaseSettings):
|
||||||
|
model_config = pydantic_settings.SettingsConfigDict(
|
||||||
|
env_file=app_split_settings_utils.ENV_PATH,
|
||||||
|
env_prefix="SERVER_",
|
||||||
|
env_file_encoding="utf-8",
|
||||||
|
extra="ignore",
|
||||||
|
)
|
||||||
|
|
||||||
|
host: str = "0.0.0.0"
|
||||||
|
port: int = 8000
|
||||||
|
|
||||||
|
|
||||||
|
class ProjectSettings(pydantic_settings.BaseSettings):
|
||||||
|
model_config = pydantic_settings.SettingsConfigDict(
|
||||||
|
env_file=app_split_settings_utils.ENV_PATH,
|
||||||
|
env_file_encoding="utf-8",
|
||||||
|
extra="ignore",
|
||||||
|
)
|
||||||
|
|
||||||
|
debug: str = "false"
|
||||||
|
jwt_secret_key: pydantic.SecretStr = pydantic.Field(default=..., validation_alias="jwt_secret_key")
|
||||||
|
|
||||||
|
@pydantic.field_validator("debug")
|
||||||
|
def validate_debug(cls, v: str) -> bool:
|
||||||
|
return v.lower() == "true"
|
4
src/fastapi_app/lib/app/split_settings/utils.py
Normal file
4
src/fastapi_app/lib/app/split_settings/utils.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
BASE_PATH = pathlib.Path(__file__).parent.parent.parent.parent.resolve()
|
||||||
|
ENV_PATH = BASE_PATH / ".env"
|
Loading…
Reference in New Issue
Block a user