家計簿アプリを作成する⑧【ログイン画面(DB処理)】

Python

ログイン画面作成(DB処理)

家計簿アプリを使用するためのログイン画面のDB処理

Login_Adapterクラス

概要

Login_Adapterクラスは自作Enginクラスを継承している

家計簿アプリを作成する③【SQLAlchemyのEngineを作成】
家計簿アプリ作成【SQLAlchemyのEngineを作成する】SQLAlchemyでデータベースへの接続とSQL操作の実行を管理するEngineクラスを作成するEngineモジュールEngineクラスEngineクラスは、データベースへの...

ログイン画面(UI)から受け取ったユーザーID、パスワードを元に
・ログ出力
・ログイン認証

を行う

【ログ出力】
・メソッド開始時とメソッド終了時logテーブルに処理内容をINSERTする
ログ出力時に例外エラーが発生した場合、ログ出力時例外エラー用メッセージをログイン画面(UI)に返却する

log_seqlog_kindsfunction_idlog_detailuser_idoperate_at
495SI-SEL-USERSログイン画面 users:a 取得 件login2025-06-11 20:31:04.620985
496EI-SEL-USERSログイン画面 users:a 取得 0件 認証失敗login2025-06-11 20:31:04.645800
497SI-SEL-USERSログイン画面 users:test 取得 件login2025-06-11 20:31:10.441482
498EI-SEL-USERSログイン画面 users:test 取得 1件 認証失敗login2025-06-11 20:31:10.692961
499SI-SEL-USERSログイン画面 users:test 取得 件login2025-06-11 20:31:15.327481
500EI-SEL-USERSログイン画面 users:test 取得 1件 認証成功login2025-06-11 20:31:15.566719

【ユーザー情報取得】
ログイン画面(UI)から受け取ったユーザーIDと一致するユーザー情報を取得する

【取得したユーザー情報の確認】
・取得したユーザー情報がない場合
「ログインに失敗しました。」のメッセージをログイン画面(UI)に返却する
・取得したユーザー情報があり、「取得したユーザー情報のパスワード」と「ログイン画面(UI)から受け取ったパスワード」が一致する場合
取得したユーザー情報をログイン画面(UI)に返却する
・取得したユーザー情報があるが、パスワードが異なる場合
「ログインに失敗しました。」のメッセージをログイン画面(UI)に返却する

例外エラー
ログ出力以外で例外エラーが発生した場合
例外エラー用メッセージをログイン画面(UI)に返却する
(例外エラー用メッセージ内容は「家計簿アプリを作成する③【SQLAlchemyのEngineを作成】」のMessageクラスを参照)

家計簿アプリを作成する③【SQLAlchemyのEngineを作成】
家計簿アプリ作成【SQLAlchemyのEngineを作成する】SQLAlchemyでデータベースへの接続とSQL操作の実行を管理するEngineクラスを作成するEngineモジュールEngineクラスEngineクラスは、データベースへの...
ソースコード
from sqlalchemy import select
from db.models import User
from db.common.engine import Engine, Return_Info
from werkzeug.security import check_password_hash


# ログイン用ユーザー情報テーブル接続
class Login_Adapter(Engine):
    def __init__(self):
        super().__init__()
        # 画面名を設定
        self.display_name = self.const.Display.LOGIN  # ログイン

    # ログイン認証
    def login(self, arg_where_user_id, arg_password):
        """
        ログイン認証を実行する
        引数
            arg_where_user_id:検索条件
            arg_password:パスワード
        """
        # 返却用クラスをインスタンス化
        return_user = Return_Info()
        # ログ出力のfunction_idを作成
        str_log_function_id = self.message.Log_Function_Id.id.format(
            self.const.Log_Kinds.INFO,
            self.const.Log_Process.SELECT,
            self.const.Log_Function.USERS,
        )
        # STARTログ出力
        error_message = self.create_log(
            self.const.Log_Kinds.START,
            str_log_function_id,
            self.message.Log_Message.LOGIN.format(
                arg_where_user_id,
                self.const.Const_Text.TEXT_BLANK,
            ),
            self.const.Login.USER_ID,
        )
        # STARTログ出力失敗の場合
        if error_message != None:
            # 返却用のメッセージボックスに例外エラーメッセージを代入する
            return_user.return_message_box = error_message
            return return_user
        else:
            try:
                # ユーザー情報を取得するSELECT文を作成
                # Where句に引数の検索条件を設定する
                stmt = select(User).where(User.user_id == arg_where_user_id)
                # SELECT文を全件取得で実行する
                select_row = self.session.scalars(stmt).all()
                # 取得結果:select_rowが0件の場合
                if len(select_row) == 0:
                    # 返却用のメッセージボックスにIDとメッセージ内容を代入する
                    return_user.return_message_box.message_id = "HAB004C"
                    return_user.return_message_box.message_text = (
                        self.message.Message_Box.HAB004C.format(
                            self.const.Display.LOGIN
                        )
                    )
                    # ENDログ出力
                    error_message = self.create_log(
                        self.const.Log_Kinds.END,
                        str_log_function_id,
                        self.message.Log_Message.LOGIN_ERROR.format(
                            arg_where_user_id,
                            len(select_row),
                        ),
                        self.const.Login.USER_ID,
                    )
                    # ENDログ出力失敗の場合
                    if error_message != None:
                        # 返却用のメッセージボックスに例外エラーメッセージを代入する
                        return_user.return_message_box = error_message
                        return return_user
                    else:
                        return return_user
                else:
                    # 取得したユーザー情報のハッシュ化されたパスワードと引数パスワードが一致する場合
                    if check_password_hash(select_row[0].password, arg_password):
                        # 返却用の返却行に取得したユーザー情報を代入する
                        return_user.return_row = select_row
                        # ENDログ出力
                        error_message = self.create_log(
                            self.const.Log_Kinds.END,
                            str_log_function_id,
                            self.message.Log_Message.LOGIN_SUCCESS.format(
                                arg_where_user_id,
                                len(select_row),
                            ),
                            self.const.Login.USER_ID,
                        )
                        # ENDログ出力失敗の場合
                        if error_message != None:
                            # 返却用のメッセージボックスに例外エラーメッセージを代入する
                            return_user.return_message_box = error_message
                            return return_user
                        else:
                            return return_user
                    else:
                        # 返却用のメッセージボックスにIDとメッセージ内容を代入する
                        return_user.return_message_box.message_id = "HAB004C"
                        return_user.return_message_box.message_text = (
                            self.message.Message_Box.HAB004C.format(
                                self.const.Display.LOGIN
                            )
                        )
                        # ENDログ出力
                        error_message = self.create_log(
                            self.const.Log_Kinds.END,
                            str_log_function_id,
                            self.message.Log_Message.LOGIN_ERROR.format(
                                arg_where_user_id,
                                len(select_row),
                            ),
                            self.const.Login.USER_ID,
                        )
                        # ENDログ出力失敗の場合
                        if error_message != None:
                            # 返却用のメッセージボックスに例外エラーメッセージを代入する
                            return_user.return_message_box = error_message
                            return return_user
                        else:
                            return return_user
            except Exception as e:
                # 例外エラー用メッセージ作成
                return_user.return_message_box = self.exception_log(
                    str_log_function_id, e, self.const.Login.USER_ID
                )
                return return_user
            finally:
                # セッションを閉じる
                self.session.close()

全体コード(GitHub)

household_account_book/db/login_adapter.py at main · SakumaTakayuki/household_account_book
Contribute to SakumaTakayuki/household_account_book development by creating an account on GitHub.