def __init__(self, app: ASGIApp) -> None: super().__init__( app, allow_origins=get_env().allow_origins, allow_methods=cors.ALL_METHODS, allow_headers=get_env().allow_headers, allow_credentials=True, )
def jwt_encode_handler(claims: dict) -> str: """ クレームセットをエンコードしてJWT文字列を返す Args: claims (dict): クレームセット Returns: str: JsonWebToken """ return jwt.encode(claims, get_env().jwt_secret_key, get_env().jwt_algorithm)
def create_test_database(): # テストDBが削除されずに残ってしまっている場合は削除 if database_exists(get_env().test_database_url): drop_database(get_env().test_database_url) # テストDB作成 _con = \ psycopg2.connect('host=db user=postgres password=postgres') _con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) _cursor = _con.cursor() _cursor.execute('CREATE DATABASE test_db_fastapi_sample') # テストDBにテーブル追加 Base.metadata.create_all(bind=test_db_connection)
def jwt_decord_handler(jwt_string: str) -> Dict[str, Any]: """ JWT文字列をデコードしてクレームセットを返す Args: jwt_string (str): JWT文字列 Returns: Dict[str, Any]: JWTをデコードして取得したクレームセット """ claims = jwt.decode( jwt_string, get_env().jwt_secret_key, algorithms=get_env().jwt_algorithm, ) return claims
def jwt_claims_handler(user: User, token_type: str = '') -> Dict[str, Any]: """ クレームセットを生成 Args: user (User): クレームセット含めるユーザー情報 token_type (str): トークンタイプ Returns: Dict[str, Any]: クレームセット Raises: AssertionError: 不正なトークンタイプが指定された場合 """ assert token_type in PROTECTED_TOKEN_TYPES, \ f'引数token_type には{"".join(PROTECTED_TOKEN_TYPES)}を指定してください' claims = { 'token_type': token_type, 'user_id': user.id, } # 「アクセストークン」の有効期限設定 if claims['token_type'] == TYPE_ACCESS_TOKEN: claims['exp'] = datetime.utcnow() + timedelta( seconds=get_env().jwt_access_token_expire) return claims
from typing import List, TypeVar from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session, query from core.config import get_env from migrations.models import Base ModelType = TypeVar("ModelType", bound=Base) connection = create_engine( get_env().database_url, echo=get_env().debug, encoding='utf-8', ) Session = scoped_session(sessionmaker(connection)) def get_db_session() -> scoped_session: """ 新しいDBコネクションを返す """ return scoped_session(sessionmaker(connection)) class BaseCRUD: """ データアクセスクラスのベース """ model: ModelType = None def __init__(self, db_session: scoped_session) -> None:
def pytest_sessionfinish(session, exitstatus): """ pytest終了時に一度だけ呼ばれる処理 """ # テストDB削除 if database_exists(get_env().test_database_url): drop_database(get_env().test_database_url)
def __drop_test_database(self): """ テストDB削除""" drop_database(get_env().test_database_url)
import psycopg2 from core.config import get_env from crud.base import get_db_session from fastapi.testclient import TestClient from main import app from migrations.models import Base from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy_utils import database_exists, drop_database test_db_connection = create_engine( get_env().test_database_url, encoding='utf8', pool_pre_ping=True, ) class BaseTestCase: def setup_method(self, method): """ 前処理""" # テストDB作成 self.__create_test_database() self.db_session = self.get_test_db_session() # APIクライアントの設定 self.client = TestClient(app, base_url='https://localhost',) # DBをテスト用のDBでオーバーライド app.dependency_overrides[get_db_session] = \
from starlette.middleware.authentication import AuthenticationMiddleware from api.endpoints.swagger_ui import swagger_ui_router from api.endpoints.v1 import api_v1_router from core.config import get_env from middlewares import (AuthenticationBackend, DBSessionMiddleware, CORSMiddleware, HttpRequestMiddleware) app = FastAPI( docs_url=None, # Noneを設定しないとswagger-uiのルーターで定義したものに変わらない redoc_url=None, # Noneを設定しないとswagger-uiのルーターで定義したものに変わらない ) app.include_router(api_v1_router, prefix='/api/v1') # ミドルウェアの設定 app.add_middleware( AuthenticationMiddleware, backend=AuthenticationBackend()) # 追加(HttpRequestMiddlewareより前に追加) app.add_middleware(HttpRequestMiddleware) app.add_middleware(DBSessionMiddleware) app.add_middleware(CORSMiddleware) # @app.get("/") # async def root(): # return {"message": "Hello World"} # swagger-uiは開発時のみ表示されるようにする if get_env().debug: app.include_router(swagger_ui_router)