Merge pull request #78 from grillazz/36-add-performance-tests-with-locust

refactor project settings
This commit is contained in:
Jakub Miazek 2023-03-09 21:16:29 +01:00 committed by GitHub
commit 1e3c30158c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 40 deletions

View File

@ -7,7 +7,9 @@
![fastapi-sqlalchemy-asyncpg](/static/fsap_1.jpg)
Example for [FastAPI](https://fastapi.tiangolo.com/) integration with [SQLAlchemy](https://www.sqlalchemy.org/) ORM with PostgreSQL via [asyncpg](https://github.com/MagicStack/asyncpg) a fast Database Client Library for python/asyncio.
Example of [FastAPI](https://fastapi.tiangolo.com/) integration supported by almighty [Pydantic](https://github.com/pydantic/pydantic)
with [SQLAlchemy ORM](https://www.sqlalchemy.org/) and PostgreSQL
connected via fastest Database Client Library for python/asyncio [asyncpg](https://github.com/MagicStack/asyncpg).
Beside of using latest and greatest version of [SQLAlchemy](https://www.sqlalchemy.org/) with it robustness, powerfulness and speed
of [asyncpg](https://github.com/MagicStack/asyncpg) there is [FastAPI](https://fastapi.tiangolo.com/) (modern, fast (high-performance),

View File

@ -1,46 +1,20 @@
import os
from functools import lru_cache
from pydantic import BaseSettings
from app.utils import get_logger
logger = get_logger(__name__)
from pydantic import BaseSettings, PostgresDsn
class Settings(BaseSettings):
"""
BaseSettings, from Pydantic, validates the data so that when we create an instance of Settings,
environment and testing will have types of str and bool, respectively.
Parameters:
pg_user (str):
pg_pass (str):
pg_database: (str):
pg_test_database: (str):
asyncpg_url: AnyUrl:
asyncpg_test_url: AnyUrl:
Returns:
instance of Settings
"""
pg_user: str = os.getenv("SQL_USER", "")
pg_pass: str = os.getenv("POSTGRES_PASSWORD", "")
pg_host: str = os.getenv("SQL_HOST", "")
pg_database: str = os.getenv("SQL_DB", "")
asyncpg_url: str = (
f"postgresql+asyncpg://{pg_user}:{pg_pass}@{pg_host}:5432/{pg_database}"
asyncpg_url: PostgresDsn = PostgresDsn.build(
scheme="postgresql+asyncpg",
user=os.getenv("SQL_USER"),
password=os.getenv("POSTGRES_PASSWORD"),
host=os.getenv("SQL_HOST"),
port="5432",
path=f"/{os.getenv('SQL_DB') or ''}",
)
jwt_secret_key: str = os.getenv("SECRET_KEY", "")
jwt_algorithm: str = os.getenv("ALGORITHM", "")
jwt_access_toke_expire_minutes: int = os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", 1)
@lru_cache
def get_settings():
logger.info("Loading config settings from the environment...")
return Settings()

View File

@ -1,6 +1,5 @@
from collections.abc import AsyncGenerator
from fastapi.encoders import jsonable_encoder
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
@ -10,13 +9,11 @@ from app.utils import get_logger
logger = get_logger(__name__)
global_settings = config.get_settings()
url = global_settings.asyncpg_url
engine = create_async_engine(
url,
global_settings.asyncpg_url,
future=True,
echo=True,
json_serializer=jsonable_encoder,
)
# expire_on_commit=False will prevent attributes from being expired

View File

@ -7,7 +7,7 @@ from app.utils import get_logger
logger = get_logger(__name__)
app = FastAPI(title="Stuff And Nonsense API", version="0.4")
app = FastAPI(title="Stuff And Nonsense API", version="0.5")
app.include_router(stuff_router)
app.include_router(nonsense_router)