From 13350f85e8063122cc798da86b08b79e1fb0f1b2 Mon Sep 17 00:00:00 2001 From: Stanislav Roslavtsev Date: Mon, 24 Jul 2023 12:31:28 +0300 Subject: [PATCH 1/2] Initial commit --- migrations/env.py | 8 ++++---- rating_api/__init__.py | 1 + rating_api/routes/base.py | 5 +++-- rating_api/routes/models/base.py | 5 ++--- rating_api/settings.py | 9 +++------ requirements.txt | 1 + 6 files changed, 14 insertions(+), 15 deletions(-) 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..179ff44 100644 --- a/rating_api/routes/models/base.py +++ b/rating_api/routes/models/base.py @@ -1,4 +1,4 @@ -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict class Base(BaseModel): @@ -8,5 +8,4 @@ def __repr__(self) -> str: 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..9fd26f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,5 +6,6 @@ gunicorn logging-profcomff psycopg2-binary pydantic[dotenv] +pydantic-settings SQLAlchemy uvicorn From 89c5d4c86b61bb63e32daa1d9b4a67edc500b951 Mon Sep 17 00:00:00 2001 From: Stanislav Roslavtsev Date: Thu, 27 Jul 2023 18:04:04 +0300 Subject: [PATCH 2/2] Update requierements.txt + Pv2 fix --- rating_api/routes/models/base.py | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rating_api/routes/models/base.py b/rating_api/routes/models/base.py index 179ff44..7748216 100644 --- a/rating_api/routes/models/base.py +++ b/rating_api/routes/models/base.py @@ -4,7 +4,7 @@ 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)) diff --git a/requirements.txt b/requirements.txt index 9fd26f2..1b6d4e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ fastapi-sqlalchemy gunicorn logging-profcomff psycopg2-binary -pydantic[dotenv] +pydantic pydantic-settings SQLAlchemy uvicorn