Beispiel #1
0
 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,
     )
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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:
Beispiel #7
0
def pytest_sessionfinish(session, exitstatus):
    """ pytest終了時に一度だけ呼ばれる処理
    """
    # テストDB削除
    if database_exists(get_env().test_database_url):
        drop_database(get_env().test_database_url)
Beispiel #8
0
 def __drop_test_database(self):
     """ テストDB削除"""
     drop_database(get_env().test_database_url)
Beispiel #9
0
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] = \
Beispiel #10
0
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)