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