プログラミング学習

【Python】ログイン機能を作る「Flask-Login」⑤

投稿日:

「ログイン機能を作る」【Part5】を書いていきます。
前回作成した「入力フォーム」からログインできる機能を追加していきます。

ログイン機能を追加しよう

今回は、決められた「name(名前)」,「mail(メールアドレス)」を入力すると、ログインできるようにしていきます。

④の記事はこちら。

「UserMixin」をインポートしよう

ログインしているユーザーの情報を保持する「UserMixin」をインポートしていきます。

from flask import Flask, render_template

-----------------------------------------------------------------

from flask_login import LoginManager, login_required, UserMixin

-----------------------------------------------------------------

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
app.config['SECRET_KEY'] = "secret"

class LoginForm(FlaskForm):
  name = StringField('名前')
  mail = StringField('メールアドレス')
  submit = SubmitField('ログイン')

@login_manager.user_loader

@app.route('/')
def index():
  return render_template('top.html')

@app.route('/member')
@login_required
def member():
  return render_template('member.html')

@app.route('/login', methods=['GET','POST'])
def login():
  form = LoginForm()
  return render_template('login.html',form=form)

@app.route('/logout')
def logout():
  return render_template('logout.html')

if __name__ == "__main__":
    app.run(host="localhost", debug=True)

Userクラスを定義しよう

「ログインが必要なページ(会員ページ)」にアクセスする際に「@login_manager.user_loader」が読み込まれます。
そこに必要な「user_id」を返すためのものになります。

from flask import Flask, render_template
from flask_login import LoginManager, login_required, UserMixin
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
app.config['SECRET_KEY'] = "secret"

-----------------------------------------------------------------

class User(UserMixin):
  def __init__(self,user_id):
    self.id = user_id

-----------------------------------------------------------------

class LoginForm(FlaskForm):
  name = StringField('名前')
  mail = StringField('メールアドレス')
  submit = SubmitField('ログイン')

@login_manager.user_loader

@app.route('/')
def index():
  return render_template('top.html')

@app.route('/member')
@login_required
def member():
  return render_template('member.html')

@app.route('/login', methods=['GET','POST'])
def login():
  form = LoginForm()
  return render_template('login.html',form=form)

@app.route('/logout')
def logout():
  return render_template('logout.html')

if __name__ == "__main__":
    app.run(host="localhost", debug=True)

「user_loader」を設定しよう

先ほど紹介した「@login_manager.user_loader」を設定していきます。
これでログインできるユーザーを認証します。

from flask import Flask, render_template
from flask_login import LoginManager, login_required, UserMixin
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
app.config['SECRET_KEY'] = "secret"

class User(UserMixin):
  def __init__(self,user_id):
    self.id = user_id

class LoginForm(FlaskForm):
  name = StringField('名前')
  mail = StringField('メールアドレス')
  submit = SubmitField('ログイン')

-----------------------------------------------------------------

@login_manager.user_loader
def load_user(user_id):
  return User(user_id)

-----------------------------------------------------------------

@app.route('/')
def index():
  return render_template('top.html')

@app.route('/member')
@login_required
def member():
  return render_template('member.html')

@app.route('/login', methods=['GET','POST'])
def login():
  form = LoginForm()
  return render_template('login.html',form=form)

@app.route('/logout')
def logout():
  return render_template('logout.html')

if __name__ == "__main__":
    app.run(host="localhost", debug=True)

ログイン機能を作っていこう

ログイン機能を作っていくうえで以下の二つを行っていきます。

  1. 「flask」から「redirect」をインポート ※「render_template」の後ろ
  2. 「flask_login」から「login_user」をインポート  ※「UserMixin」の後ろ
  3. ログイン処理のコードを追記
----------------------------------------------------------------------------

1.from flask import Flask, render_template, redirect
2.from flask_login import LoginManager, login_required, UserMixin, login_user

----------------------------------------------------------------------------

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
app.config['SECRET_KEY'] = "secret"

class User(UserMixin):
  def __init__(self,user_id):
    self.id = user_id

class LoginForm(FlaskForm):
  name = StringField('名前')
  mail = StringField('メールアドレス')
  submit = SubmitField('ログイン')

@login_manager.user_loader
def load_user(user_id):
  return User(user_id)

@app.route('/')
def index():
  return render_template('top.html')

@app.route('/member')
@login_required
def member():
  return render_template('member.html')

@app.route('/login', methods=['GET','POST'])
def login():
  form = LoginForm()

-----------------------------------------------------------------

3. if form.validate_on_submit():
    if form.name.data == 'ANDoblog' and form.mail.data == 'test@mail':
      user = User(form.name.data)
      login_user(user)
      return redirect('/member')
    else:
      return 'ログインに失敗しました'

-----------------------------------------------------------------

  return render_template('login.html',form=form)

@app.route('/logout')
def logout():
  return render_template('logout.html')

if __name__ == "__main__":
    app.run(host="localhost", debug=True)

ログアウト機能を作ろう

ログアウトは「logout_user」をインポートしてあげて「ログアウトページ」の処理のところに追加するだけです。

from flask import Flask, render_template, redirect

----------------------------------------------------------------------------

from flask_login import LoginManager, login_required, UserMixin, login_user, logout_user

----------------------------------------------------------------------------

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
app.config['SECRET_KEY'] = "secret"

class User(UserMixin):
  def __init__(self,user_id):
    self.id = user_id

class LoginForm(FlaskForm):
  name = StringField('名前')
  mail = StringField('メールアドレス')
  submit = SubmitField('ログイン')

@login_manager.user_loader
def load_user(user_id):
  return User(user_id)

@app.route('/')
def index():
  return render_template('top.html')

@app.route('/member')
@login_required
def member():
  return render_template('member.html')

@app.route('/login', methods=['GET','POST'])
def login():
  form = LoginForm()
 if form.validate_on_submit():
    if form.name.data == 'ANDoblog' and form.mail.data == 'test@mail':
      user = User(form.name.data)
      login_user(user)
      return redirect('/member')
    else:
      return 'ログインに失敗しました'
  return render_template('login.html',form=form)

@app.route('/logout')
def logout():
----------------------------------------------------------------------------

 logout_user()

---------------------------------------------------------------------------- 
  return render_template('logout.html')

if __name__ == "__main__":
    app.run(host="localhost", debug=True)

おつかれさまです
では「login.py」を起動して動作確認していきましょう。

確認してみよう

では「localhost:5000」にアクセス。

名前に「ANDoblog」,メールアドレスに「test@mail」を入力しないとログインできないことが確認できると思います。

ログアウトもしっかりできていますね。

まとめ

今回は「決められた入力」をすると、ログインできる機能を作りました。
このままだと実用性がないので、ユーザーごとのログイン情報を管理できるような仕組みを作っていきたいですね。
それではまた。

-プログラミング学習
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【Python】Flask-WTFを使ってみよう④

前回は「文字数」の「バリデーション」を設定しました。今回は「パスワード」の方を設定していきます。 パスワードの設定をしてみよう 前回の記事はこちら。 【Python】Flask-WTFを使ってみよう③ …

【Python】クラスってなんだ?

Pythonを学ぶ上で「クラスってなんだ?」と思ったことはありますか?調べてみると、あるものに例えられていて分かりやすいものがありました。今回はそちらを参考に「クラス」とはなにかを紹介したいと思います …

【Python】掲示板に「削除機能」を追加してみた①

以前作成した「Flask掲示板」に、投稿を削除する機能を追加してみました。「Flask-WTF」と「SQLAlchemy」を使ったものです。今回は、コードと機能を紹介したいと思います。 掲示板に「削除 …

【Python】顔を検出してみよう

これまで「OpenCV」で画像を読み込んだり、加工してきました。今回は、「顔」の検出をやってみようと思います。 Pythonで顔を検出してみよう コードを真似しよう import cv2 face_c …

社内イントラネットに掲示板作成してみた。③

「社内イントラネットに掲示板作成してみた。②」に続きまして掲示板作成時のコードを紹介します。 コードを見てみよう クライアント側(利用者がみる側)とサーバー側(処理を実行する側)の2つを見ていきます。 …