🦍

Flaskでアプリケーション作成

2024/03/30に公開

仮想環境の構築

まずは、仮想環境の構築を行なっていきます。仮想環境を作成しておくことで、ライブラリの管理やバージョン管理などを行うことができます。個人開発でアプリケーションを作成する場合は、仮想環境の構築はほぼ必須と言って良いでしょう。仮想環境の構築が難しいと思っている人がいると思いますが、たった一行のコマンドだけで構築できます。

python3 -m venv app

アプリケーションの名前を「game」にしたければ、「app」のところを「game」にするだけで変更することができます。構築ができたら、仮想環境をアクティブモードにします。アクティブモードにした上で、今後はライブラリのインストールを行なっていきます。

cd app/bin
source activate
cd ..

アクティブモードになっていれば、ターミナルの左端が(app)のように表示されているはずです。

(app)xxxxx@yyy

必要なパッケージのインストール

今回のアプリケーションを作成するにあたり、必要なパッケージをインストールします。

pip install flask
pip install sqlalchemy
pip install flask-sqlalchemy
pip install pandas

ログイン画面

パスワードとユーザ名が正しく入力された場合に限りログインできるようにします。

# ログイン
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        
        user = Employee.query.filter_by(name = request.form['name']).first()
        if request.form['name'] == '':
            flash('ユーザ名を入力してください')

        elif request.form['password'] == '':
            flash('パスワードを入力してください')

        elif request.form['name'] != user.name:
            flash(f'ユーザ名が異なります')

        elif request.form['password'] != user.password:
            flash(f'パスワードが異なります')
        else:
            session['logged_in'] = True
            #flash('ログインしました')
            return redirect('/')  # nameとpasswordが合っていたい時だけ、indexにリダイレクトされる
    return render_template('login.html')

ログインページのボタンが押された時に、POSTメソッドが動作します。データベースの中で入力された名前があるのかを以下のように探しています。

user = Employee.query.filter_by(name = request.form['name']).first()

ユーザ名とパスワードが入力されていない場合はエラー画面が表示されます。また、データベース内の名前とパスワードが不一致の場合もエラー画面が表示されます。POSTメソッド以外(ボタンが押されていない)時と合わせて、render_tremplateでログインページを表示させるようにしましょう。render_templateとは、htmlファイルをそのまま表示させるメソッドと覚えておきましょう。

ユーザ名とパスワードが一致した場合は、セッションをTrueにします。セッションをTrueにしておくと、少し時間をおいて再ログインする際にユーザ名やパスワードの再入力が不要になります。redirect('/')とすることで、ルートディレクトリに戻るようにしています。

ルートディレクトリ

@app.route('/')
def index():
    if not session.get('logged_in'):
        return redirect('/login')
    return redirect('/employees')

@app.route('/')は、ルートディレクトリと呼ばれ、ディレクトリの先頭(根の部分)です。ログインページで正しくログインできた場合、 セッションがTrueになっているので、'employees'に移動することができます。反対に、Falseになっているときは、'login'に再読み込みされます。

redirectの使い方
@app.route('yyyy',methods=['GET'])
def xxxx():
    if ....

redirectの使い方について簡単に説明しておきます。redirect('xxxx')というように自分が作成した関数名を入力します。間違って、redirect('yyyy')のようにディレクトリ名を入力しないように気をつけましょう。

ログアウト画面

# ログアウト
@app.route('/logout', methods=['GET'])
def logout():
    session.pop('logged_in', None)
    flash('ログアウトしました')
    return redirect('/')

ログアウト画面も忘れないうちに先に作っておきましょう。ログアウトボタンが押されたら、セッションの削除を行います。セッションの削除には、session.popを使用します。ログイン時にsession['logged_in']としていたのでこの変数名を削除するだけです。redirectでルートディレクトリに遷移し、最初のユーザ名とパスワードを入力するログイン画面が表示されていると思います。

従業員の追加

新人のアルバイトさんを追加するページを作成しましょう。

@app.route('/add_employee', methods=['GET', 'POST'])
def add_employee():
    if request.method == 'GET':
        return render_template('add_employee.html')
    if request.method == 'POST':
        form_name = request.form.get('name')  # str
        form_pass = request.form.get('password')  # str
        employee = Employee(
            name=form_name,
            password=form_pass,
        )
        db.session.add(employee)
        db.session.commit()
        return redirect(url_for('index'))

htmlファイル

<form action="/add_employee" method="POST">
        <label for="name">従業員名</label>
        <input name="name"></input>
        <label for="password">パスワード</label>
        <input name="password"></input>
        <button type="submit" class="btn btn-primary">従業員追加</button>
    </form>

追加するボタンを押さない(ただ表示させる)時は、GETメソッドが起動しています。htmlファイルを表示させるだけなので、render_templateで返却します。

追加するボタンが押された時は、POSTメソッドが起動しています。入力フォームから、「name」、「password」の内容をrequest.form.getで獲得できます。

passwordの場合
htmlファイル : <input name="password" .../>
views.py     : form_pass = request.form.get('password') 

受け取ったユーザ名とパスワードをデータベースに登録します。インスタンス化→add→commitの順番で行います。インスタンス化って思った人は、名前とパスワード持っているEmployee型の変数と思ってもらえれば大丈夫です。あまり難しく考えずに...。

db.session.add(employee)
db.session.commit()

2段階踏むことでデータベースに登録できることは覚えておきましょう。

Discussion