プログラミング

【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で掲示板を作ってみよう①

前回「Flask」の動作を確認することができたので「掲示板」の作成をやっていきたいと思います。今回は「index.html」を表示させるところまでいきたいと思います。 前回の記事はこちら 【Pytho …

【エクセル】VBAで変数の宣言

以前に、エクセルでできる「ちょこっとプログラミング」を書きました。そのなかで「変数の宣言」について触れたんですが、今回はもう少し掘り下げて紹介していこうと思います。 以前の記事はこちら。 【エクセル】 …

HTMLで出来ること

今回はプログラミングを学ぶ上で最初に通る道であろうHTMLについてです。 プログラミング入門 プログラミング言語は様々ありますがWEBページを作るうえで使用されるのがHTMLというものです。このページ …

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

「Flask-Login」を使って「ログイン機能」を作っていきます。これでPart3になりますね。今回は「ログインが必要なページ」を作っていきたいと思います。 「@login_required」を使っ …

【エクセル】で「ちょこっとプログラミング」応用編#1

プログラミングをしたことのない人向けにExcelでできる「ちょこっとプログラミング」を紹介します。今回は「空白のセルまで値を取得する」から【応用】として「セルの値で新規ファイルを作成する」を題材にやっ …

YouTube