diff --git a/ecs/jskult-webapp/src/aws/s3.py b/ecs/jskult-webapp/src/aws/s3.py index de11949c..2b6251b1 100644 --- a/ecs/jskult-webapp/src/aws/s3.py +++ b/ecs/jskult-webapp/src/aws/s3.py @@ -23,7 +23,7 @@ class S3Client(AWSAPIClient): 'Bucket': bucket_name, 'Key': file_key, # 別ファイル名に変更するための仕掛け。Unicode文字はquoteでエスケープが必要 - 'ResponseContentDisposition': f'attachment; filename="{quote(download_filename)}"' + 'ResponseContentDisposition': f"attachment; filename*=UTF-8''{quote(download_filename)}" }, # 有効期限20分 ExpiresIn=1200 diff --git a/ecs/jskult-webapp/src/controller/sample_send_file.py b/ecs/jskult-webapp/src/controller/sample_send_file.py deleted file mode 100644 index b866763c..00000000 --- a/ecs/jskult-webapp/src/controller/sample_send_file.py +++ /dev/null @@ -1,44 +0,0 @@ -from typing import Annotated - -from fastapi import APIRouter, File, Form, Request, UploadFile - -from src.templates import templates - -router = APIRouter() - - -@router.get('/') -def get_view(request: Request): - return templates.TemplateResponse( - 'sample_send_file.html', - { - 'request': request - } - ) - - -@router.post('/') -# file.readがCoroutineが返ってくるため、必ずasync関数にする -async def post_view( - # formからファイルを受け取る。(formタグにenctype="multipart/form-data"を指定すること) - file: Annotated[UploadFile, File()], - message: str = Form() -): - # ファイルを読み込む(Coroutineが取れるため、必ずawaitする) - file_bytes = await file.read() - # 閉じとく - await file.close() - # 読み込んだファイルはbytesで返ってくるので、デコードする - file_content = file_bytes.decode() - print(file_content) - try: - return { - # ファイル名 - "file_name": file.filename, - # ファイルのバイト数 - "file_size": file.size, - # Content-Type - "file_content_type": file.content_type - } - except Exception: - return {'code': 'fail'} diff --git a/ecs/jskult-webapp/src/core/__init__.py b/ecs/jskult-webapp/src/core/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ecs/jskult-webapp/src/core/tasks.py b/ecs/jskult-webapp/src/core/tasks.py deleted file mode 100644 index 93f4c8f5..00000000 --- a/ecs/jskult-webapp/src/core/tasks.py +++ /dev/null @@ -1,21 +0,0 @@ -"""FastAPIサーバーの起動・終了イベントのラッパー""" - -from typing import Callable - -from fastapi import FastAPI - -from src.db.tasks import close_db, init_db - - -def create_start_app_handler(app: FastAPI) -> Callable: - def start_app() -> None: - init_db(app) - - return start_app - - -def create_stop_app_handler(app: FastAPI) -> Callable: - def stop_app() -> None: - close_db(app) - - return stop_app diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py index 971c859e..b4a54fb8 100644 --- a/ecs/jskult-webapp/src/db/database.py +++ b/ecs/jskult-webapp/src/db/database.py @@ -1,4 +1,4 @@ -from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, +from sqlalchemy import (Connection, CursorResult, Engine, NullPool, create_engine, event, exc, text) from sqlalchemy.engine.url import URL from sqlalchemy.pool import Pool @@ -63,8 +63,7 @@ class Database: self.__engine = create_engine( self.__connection_string, - pool_timeout=5, - poolclass=QueuePool + poolclass=NullPool ) @classmethod @@ -181,7 +180,7 @@ class Database: self.__connection = None def to_jst(self): - self.execute('SET time_zone = "+9:00"') + self.execute('SET time_zone = "+9:00"') def __execute_with_transaction(self, query: str, parameters: dict): # トランザクションを開始してクエリを実行する diff --git a/ecs/jskult-webapp/src/db/tasks.py b/ecs/jskult-webapp/src/db/tasks.py deleted file mode 100644 index da1a6fdc..00000000 --- a/ecs/jskult-webapp/src/db/tasks.py +++ /dev/null @@ -1,14 +0,0 @@ -from fastapi import FastAPI - -from src.db.database import Database - - -def init_db(app: FastAPI) -> None: - # DB接続モジュールを初期化 - database = Database.get_instance() - # FastAPI App内で使える変数として追加 - app.state._db = database - - -def close_db(app: FastAPI) -> None: - app.state._db = None diff --git a/ecs/jskult-webapp/src/depends/database.py b/ecs/jskult-webapp/src/depends/database.py index c5b28042..65a8a967 100644 --- a/ecs/jskult-webapp/src/depends/database.py +++ b/ecs/jskult-webapp/src/depends/database.py @@ -1,17 +1,8 @@ -from typing import Callable, Type - -from fastapi import Depends from starlette.requests import Request from src.db.database import Database -from src.repositories.base_repository import BaseRepository def get_database(request: Request) -> Database: + # medaca_routerでDB接続エンジンが初期化される return request.app.state._db - - -def get_repository(Repo_type: Type[BaseRepository]) -> Callable: - def get_repo(db: Database = Depends(get_database)) -> Type[BaseRepository]: - return Repo_type(db) - return get_repo diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index 8717c7cb..6ed9e6da 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -7,8 +7,6 @@ from starlette import status import src.static as static from src.controller import (bio, bio_download, healthcheck, login, logout, master_mainte, menu, root, ultmarc) -from src.controller.sample_send_file import router as sample_router -from src.core import tasks from src.error.exception_handler import http_exception_handler from src.error.exceptions import UnexpectedException @@ -36,16 +34,9 @@ app.include_router(master_mainte.router, prefix='/masterMainte') # ヘルスチェック用のルーター app.include_router(healthcheck.router, prefix='/healthcheck') -# サンプル実装、ファイル送信ルーター -app.include_router(sample_router, prefix='/sample') - # エラー発生時にログアウト画面に遷移させるハンドラー app.add_exception_handler(status.HTTP_401_UNAUTHORIZED, http_exception_handler) app.add_exception_handler(status.HTTP_403_FORBIDDEN, http_exception_handler) # サーバーエラーが発生した場合のハンドラー。HTTPExceptionではハンドリングできないため、個別に設定 app.add_exception_handler(UnexpectedException, http_exception_handler) - -# サーバー起動・終了イベントを登録 -app.add_event_handler('startup', tasks.create_start_app_handler(app)) -app.add_event_handler('shutdown', tasks.create_stop_app_handler(app)) diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index 324c777f..768c7f87 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -5,6 +5,7 @@ from fastapi.exceptions import HTTPException from fastapi.routing import APIRoute from starlette import status +from src.db.database import Database from src.depends.auth import (check_session_expired, get_current_session, verify_session) from src.error.exceptions import DBException, UnexpectedException @@ -75,6 +76,18 @@ class MeDaCaRoute(APIRoute): return response +class PrepareDatabaseRoute(MeDaCaRoute): + """事前処理として、データベースのエンジンを作成するルートハンドラー + Args: + MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー + """ + async def pre_process_route(self, request: Request): + request = await super().pre_process_route(request) + # DBエンジンを構築して状態にセット + request.app.state._db = Database.get_instance() + return request + + class BeforeCheckSessionRoute(MeDaCaRoute): """事前処理として、セッションチェックを行うルートハンドラー @@ -97,11 +110,11 @@ class BeforeCheckSessionRoute(MeDaCaRoute): return session_request -class AfterSetCookieSessionRoute(MeDaCaRoute): +class AfterSetCookieSessionRoute(PrepareDatabaseRoute): """事後処理として、セッションキーをcookieに設定するカスタムルートハンドラー Args: - MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー + PrepareDatabaseRoute (PrepareDatabaseRoute): DBエンジンセットアップルートハンドラー """ async def post_process_route(self, request: Request, response: Response): response = await super().post_process_route(request, response) diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 142c8a14..efbd3633 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -28,7 +28,7 @@ -