【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)
ログイン機能を作っていこう
ログイン機能を作っていくうえで以下の二つを行っていきます。
- 「flask」から「redirect」をインポート ※「render_template」の後ろ
- 「flask_login」から「login_user」をインポート ※「UserMixin」の後ろ
- ログイン処理のコードを追記
----------------------------------------------------------------------------
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」を入力しないとログインできないことが確認できると思います。
ログアウトもしっかりできていますね。
まとめ
今回は「決められた入力」をすると、ログインできる機能を作りました。
このままだと実用性がないので、ユーザーごとのログイン情報を管理できるような仕組みを作っていきたいですね。
それではまた。