プログラミング

【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】画像を読み込んでみよう

Pythonのライブラリの中にある「OpenCV」を使って、画像処理をしていこうと思います。今回は、画像を読み込ませて表示させます。 Pythonで画像を読み込んでみよう Pythonで「画像処理」を …

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

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

【Python】加工した画像を保存してみよう

これまで「OpenCV」を使って、画像の読み込み、表示、リサイズなどを実践してきました。今回は、その加工した画像を保存してみたいと思います。 加工した画像を保存してみよう 今回も、前回のコードに追記す …

【Python】ANACONDA NAVIGATORを使ってみよう

今回は「ANACONDA NAVIGATOR」でライブラリのインストール方法を紹介します。 ANACONDA NAVIGATORを使ってみよう 「ANACONDA NAVIGATOR」を使えば、簡単に …

【Python】Excelに画像を貼り付けてみよう

前回は「openpyxl」を使って、セルに値を入力することができました。今回は、セルに値ではなく、「画像」を貼り付けてみたいと思います。 openpyxlで画像を貼り付けてみよう 「openpyxl」 …

YouTube