diff --git a/migrations/env.py b/migrations/env.py index 75b1840..3eb2da1 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -1,12 +1,12 @@ from logging.config import fileConfig -from sqlalchemy import engine_from_config -from sqlalchemy import pool - from alembic import context +from sqlalchemy import engine_from_config, pool + from rating_api.models.base import Base from rating_api.settings import get_settings + # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config @@ -61,7 +61,7 @@ def run_migrations_online(): """ configuration = config.get_section(config.config_ini_section) - configuration['sqlalchemy.url'] = settings.DB_DSN + configuration['sqlalchemy.url'] = str(settings.DB_DSN) connectable = engine_from_config( configuration, prefix="sqlalchemy.", diff --git a/rating_api/__init__.py b/rating_api/__init__.py index ebcaeac..fa9c098 100644 --- a/rating_api/__init__.py +++ b/rating_api/__init__.py @@ -1,3 +1,4 @@ import os + __version__ = os.getenv('APP_VERSION', 'dev') diff --git a/rating_api/routes/base.py b/rating_api/routes/base.py index 15a4664..b89a6c3 100644 --- a/rating_api/routes/base.py +++ b/rating_api/routes/base.py @@ -1,15 +1,16 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi_sqlalchemy import DBSessionMiddleware + from rating_api import __version__ from rating_api.settings import get_settings + settings = get_settings() app = FastAPI( title='Рейтинг преподавателей', description='Хранение и работа с рейтингом преподавателей и отзывами на них.', version=__version__, - # Отключаем нелокальную документацию root_path=settings.ROOT_PATH if __version__ != 'dev' else '/', docs_url=None if __version__ != 'dev' else '/docs', @@ -19,7 +20,7 @@ app.add_middleware( DBSessionMiddleware, - db_url=settings.DB_DSN, + db_url=str(settings.DB_DSN), engine_args={"pool_pre_ping": True, "isolation_level": "AUTOCOMMIT"}, ) diff --git a/rating_api/routes/models/base.py b/rating_api/routes/models/base.py index d96d4d5..7748216 100644 --- a/rating_api/routes/models/base.py +++ b/rating_api/routes/models/base.py @@ -1,12 +1,11 @@ -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict class Base(BaseModel): def __repr__(self) -> str: attrs = [] - for k, v in self.__class__.schema().items(): + for k, v in self.__class__.model_json_schema().items(): attrs.append(f"{k}={v}") return "{}({})".format(self.__class__.__name__, ', '.join(attrs)) - class Config: - orm_mode = True + model_config = ConfigDict(from_attributes=True, extra="ignore") diff --git a/rating_api/settings.py b/rating_api/settings.py index 935b6b4..da8fa70 100644 --- a/rating_api/settings.py +++ b/rating_api/settings.py @@ -1,13 +1,14 @@ import os from functools import lru_cache +from pydantic import ConfigDict, PostgresDsn from pydantic_settings import BaseSettings class Settings(BaseSettings): """Application settings""" - DB_DSN: str = 'postgresql://postgres@localhost:5432/postgres' + DB_DSN: PostgresDsn = 'postgresql://postgres@localhost:5432/postgres' ROOT_PATH: str = '/' + os.getenv("APP_NAME", "") CORS_ALLOW_ORIGINS: list[str] = ['*'] @@ -15,11 +16,7 @@ class Settings(BaseSettings): CORS_ALLOW_METHODS: list[str] = ['*'] CORS_ALLOW_HEADERS: list[str] = ['*'] - class Config: - """Pydantic BaseSettings config""" - - case_sensitive = True - env_file = ".env" + model_config = ConfigDict(case_sensitive=True, env_file=".env", extra="ignore") @lru_cache diff --git a/requirements.txt b/requirements.txt index 3c83f42..1b6d4e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ fastapi-sqlalchemy gunicorn logging-profcomff psycopg2-binary -pydantic[dotenv] +pydantic +pydantic-settings SQLAlchemy uvicorn