誰でも簡単にログイン・サインアップ機能が作れる!!Flask Webアプリ開発入門

Python

概要

本日はログイン機能、サインアップ機能を解説する
また、そのほかに
Blueprint、SQLAlchemyも解説する
Blueprintはアプリを分割しモジュール化する
ためのライブラリだ
プログラムを分割することで保守性を向上
させることができる
SQLAlchemyはORMだ
ORMを使うことでSQLを書かずにプログラムから
データベースを操作できる

実装

ライブラリのインストール

まずは必要なライブラリのインストールを行う
pip install flask flask-sqlalchemy flask-loginで必要なライブラリがインストールできる

全体の構成

次に全体の構成について解説する
フォルダ構成は画像の通りだ

index.pyにはToDoリストの機能
auth.pyにはログイン、サインアップに関連する機能
models.pyはORMの定義
init.pyにはサーバ起動時の処理が記載されている
templatesフォルダの中のファイルは
login.htmlではログイン画面
signup.htmではサインアップ画面
view.htmlではToDoリストの画面
base.htmlではヘッダー部分が記載されている

起動方法

そして、いままではサーバをpython index.pyで起動していたが、
今回はflask –app project_05 runで起動する

サインアップ機能

それでは、まずサインアップ機能がどのように実装されているか解説しよう

サインアップ機能に関連するサーバ側の処理はauth.pyのsignup関数とsignup_post関数だ
signup関数では/signupにアクセスするとsignup.htmlを表示するよう指示している

signup.htmlではEmail、Name、Passwordの入力部分とSign upボタンが実装されている
Sign upボタンをクリックするとEmail、Name、Passwordの値がsignup_postに渡されて実行される

signup_postでは2つの処理を行っている
一つは入力されたEmailが既に登録済みでないかの確認
二つ目は入力された値をデータベースに登録する処理だ
まずは一つ目を詳しく解説していこう
User.query.filter_byにemailを渡している

UserはSQL Alchemyによってmodels.pyで定義されている
User定義はUserMixinとdb.Modelを継承している
UserMixinでflask_loginのログイン機能と連動させることができる
また、db.Modelを継承することでクラスとデータベースのテーブルをマッピングできる

ここでpythonインタプリタを起動し、このようなコードを実行すると
Userテーブルを作成することができる
Userクラスを通じてSQLテーブルが作成された

話をもとに戻そう
User.query.filter_byにemailを渡すとemailが一致するUserデータを
Userオブジェクトのリスト形式で取得することができる
そして、firstメソッドでリストから最初のUserオブジェクトを取得している
emailが一致した場合はuserオブジェクトが存在するのでif内の処理が実行される
if内ではメッセージを出力し、auth.signupにリダイレクトされる

signup.htmlにてメッセージはget_flashed_messagesで取得され
{{ messages[0] }}で出力されている
もしもemailが一致しなければuserはnullになるので後続のユーザー登録処理が実行される

Userにemail、name、ハッシュ化されたpasswordが渡されてオブジェクト化され、
db.session.add、db.session.commitでユーザー追加がDBに反映される
今まではSQL文をそのまま書いていたけれどSQL Alchemyを使うことで
SQL文を直接書く必要がなくなった

Blueprint

以上がサインアップ機能についてだが、もう一つ解説することがある
それはBlueprintだ
Blueprintで複数のファイルに処理を分割することができる

Blueprintを各ファイルでこのように定義し、
init.pyでregister_blueprintを使い、各ファイルの処理を登録することができる
url_forでリダイレクトする際に、今までは関数名だけを指定していたが
Blueprint名.関数名と指定する必要があるのは少し注意が必要だ

ログイン機能

続いてログイン機能について解説しよう
ログイン機能に関連するサーバ側の処理はauth.pyのlogin関数とlogin_post関数だ

logout関数と、__init__.pyのload_usesr関数
login関数では、/signupにアクセスされたときlogin.htmlにリダイレクトする指示をしている

login.htmlではEmail、passwordの入力部分とLOGINボタンが実装されている
LOGINボタンがクリックされるとEmail、passwordの値つきでlogin_postが実行される

login_postでは、主に2つの処理を行っている
一つ目は入力の妥当性チェック
二つ目はログイン処理だ
まず一つ目の入力の妥当性チェックについて解説しよう
ここでは入力したemailに該当するユーザーデータを取得している
該当するuserがない場合、もしくは
該当するuserが存在してもpasswordが間違っている場合は
メッセージを出してlogin.htmlにリダイレクトしている

メッセージはsignup.htmlと同様にget_flashed_messagesでメッセージを取得し
{{ messages[0] }}で画面に表示している

続いて、二つ目のログイン処理について解説する
ログイン処理はlogin_userを実行するだけだ
flask_loginを使えば簡単にログイン機能が実装できるのがわかるだろう

最後に解説するlogout関数では、ログアウト処理を行った後、auth.loginにリダイレクトしている
ログアウトしたらログイン画面に戻る
ログアウト処理もlogout_user処理を実行すればよいだけなので簡単だ

続いて__init__.pyのload_user関数について解説する
この関数ではセッションのチェックを行い、ログイン済みかどうかを判断している

未ログイン時のリダイレクト

ログインせずに直接http://localhost:5000/をブラウザのURL部分に入力した場合に
アクセスされるのを防ぐために@login_requiredを各関数の前に記載している
これが記載された関数はログインをしていないと実行することができない

もしログインせずにこれらの関数が実行された場合、
login_manager.login_viewで指定された画面にリダイレクトされる
auth.loginだからログイン画面にリダイレクトされる

タイトルとURLをコピーしました