6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

📍PythonとFlaskで簡単なログイン機能の作り方

6
Posted at

📍PythonとFlaskで簡単なログイン機能の作り方

PythonとFlaskでシンプルなログイン機能を作成しました。
プログラミング歴の浅い人間が書いたためわかりにくい点もあると思われますが
ご容赦下さい。
Flaskでの設定は比較的容易ですので是非チャレンジされてみて下さい!

1.コードの全体像
2.Flaskの設定
3.コードの詳細

に分けて解説していきます。

1.コードの全体像

from flask import Flask, request, redirect, url_for, session

app = Flask(__name__)
# セッション管理に必要な秘密鍵(適当な文字列を設定)
app.secret_key = 'your_secret_key'

# ログイン用の固定ユーザー(本番ではデータベースで管理する)
USER = {
    "username": "testuser",
    "password": "password123"
}

@app.route('/')
def home():
    # セッションにログイン情報があれば表示
    if 'username' in session:
        return f"ログイン中: {session['username']} <br><a href='/logout'>ログアウト</a>"
    # 未ログインならログインページへのリンクを出す
    return "ログインしていません。<br><a href='/login'>ログインはこちら</a>"

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # フォーム入力値を取得
        username = request.form['username']
        password = request.form['password']
        
        # 入力が固定ユーザーと一致すればログイン成功
        if username == USER['username'] and password == USER['password']:
            # セッションにユーザー名を保存(ログイン状態になる)
            session['username'] = username
            return redirect(url_for('home'))
        else:
            # ログイン失敗時のメッセージ
            return "ユーザー名かパスワードが違います。<br><a href='/login'>再度ログイン</a>"
    
    # GETアクセス時はログインフォームを表示
    return '''
    <form method="post">
        ユーザー名: <input type="text" name="username"><br>
        パスワード: <input type="password" name="password"><br>
        <input type="submit" value="ログイン">
    </form>
    '''

@app.route('/logout')
def logout():
    # セッションからログイン情報を削除
    session.pop('username', None)
    return redirect(url_for('home'))

if __name__ == '__main__':
    # Flaskアプリを起動(外部アクセスOK・デバッグ有効)
    app.run(host="0.0.0.0", port=5000, debug=True)

上記コードを実行すると

スクリーンショット_17-8-2025_162717_192.168.11.3.jpeg

"ログインはこちら" をクリックすると

スクリーンショット_17-8-2025_162912_127.0.0.1.jpeg

このようになります。
尚、ユーザー名とパスワードを入力してもデータベースを設定していないため
ログインすることはできません。

今回ご紹介するのは簡易的なログイン処理です。

2.Flaskの設定

次はFlaskの設定です。

簡単にFlaskについてご説明すると
Flask(フラスク)とは Pythonで動く軽量なWebフレームワーク で
「最小限の機能だけを持ち、必要に応じて自由に拡張できる」シンプルさが特徴。

具体的には
・インストールが簡単(pip install flaskでOK)

・コードが短くてわかりやすい

・小規模アプリや学習用に最適
などが挙げられます。

続いてFlaskの環境設定に移ります。

ターミナル(コマンドプロンプト)を用意しましょう。

①Pythonの確認

ターミナル(コマンドプロンプト)を開き、Pythonが入っているかを確認します。

python --version

または

python3 --version

と入力しPython 3.8以上ならOKです。

②仮想環境の作成

仮想環境を作成することでプロジェクトごとに独立した環境を作り、他のプロジェクトとのライブラリの衝突を防ぐことができます。

ターミナル(コマンドプロンプト)で

python -m venv venv

と入力します。

※仮想環境を有効化する方法はOSで違います:

Windows (PowerShell)では

venv\Scripts\activate

と入力し、

Mac/Linuxでは

source venv/bin/activate

と入力します。

有効化すると (venv) と表示されます。

③Flaskをインストール

先述した仮想環境が有効な状態でターミナル(コマンドプロンプト)を使用し
Flaskをインストールします。

pip install flask

  ⇩

pip show flask

の順で入力しインストールできたか確認します。

インストールが始まると、何かが動いていることが分かるように、ターミナル画面上に文字がたくさん出てきます。

④ファイルの作成

実際にFlaskが動くかどうか試しましょう!

VSCode又は他のエディターで app.py というPythonフォルダを作成します。

そのフォルダ内に

from flask import Flask

# Flaskアプリケーションのインスタンスを作成
app = Flask(__name__)

# ルートURL (/) にアクセスしたときの処理
@app.route('/')
def hello_world():
    return 'Hello, World!'

# アプリケーションの実行
if __name__ == '__main__':
    app.run(debug=True)

とコードを書きます。

ファイルを保存後、ターミナル(コマンドプロンプト)を開き

python app.py

と入力します。

実行後、ターミナルに表示されるURL(例 http://127.0.0.1:5000/)をブラウザで開くと、
「Hello, World!」と表示されます。

これでFlaskの設定は完了です!

3.コードの詳細

コードを部分的に分けて解説します。
上記で説明したコードも入っていますのでそれも交えて実践してみてください!

□Flaskの準備と設定

from flask import Flask, render_template, request, redirect, url_for, session

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # セッションを使うために必須

⇒Flask クラスを使ってアプリを作成します。

⇒secret_key はセッションを使うために必須で、セッション情報の暗号化に使われます。(本番環境では もっと複雑な値を設定することをおすすめします。)

□ユーザー情報の定義

USER = {
    "username": "testuser",
    "password": "password123"
}

⇒今回はデータベースを使わず、ハードコードされたユーザー情報を使います。
 本番ではデータベースや認証基盤を利用するのが一般的です。

□ホーム画面(ログイン状態の確認)

 @app.route('/')
def home():
    if 'username' in session:
        return f"ログイン中: {session['username']} <br><a href='/logout'>ログアウト</a>"
    return "ログインしていません。<br><a href='/login'>ログインはこちら</a>"

⇒セッションに username が入っていればログイン中と判定。

⇒そうでなければログインリンクを表示します。

□ログイン処理

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        
        if username == USER['username'] and password == USER['password']:
            session['username'] = username
            return redirect(url_for('home'))
        else:
            return "ユーザー名かパスワードが違います。<br><a href='/login'>再度ログイン</a>"
    
    # GETリクエストのときはログインフォームを表示
    return '''
    <form method="post">
        ユーザー名: <input type="text" name="username"><br>
        パスワード: <input type="password" name="password"><br>
        <input type="submit" value="ログイン">
    </form>

⇒GETリクエスト → ログインフォームを表示

⇒POSTリクエスト → 入力されたユーザー名・パスワードをチェック

⇒正しい場合 → セッションに保存してホームへリダイレクト

⇒間違っている場合 → エラーメッセージを表示

□ログアウト処理

@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('home'))

⇒セッションから username を削除してログアウト。

⇒その後ホーム画面に戻ります。

□アプリの実行

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000, debug=True)

⇒ターミナルに

python app.py 

と入力し起動できます。

⇒debug=True を指定すると、コードを変更したときに自動でリロードされ、エラーも詳細に表示されます。

以上となります!
是非お試し下さい!

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?