ログインした後にヘッダーにユーザーの情報を表示したい

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • [ ]ログイン機能でログインした後ヘッダーにユーザー名と権限を表示したい

前提

pythonのFlaskで、ログイン機能を実装しており、ユーザー情報のUserモデルと、ユーザー権限のAuthorityモデルを作成しています。

モデル同士を関連付けしていざログインしてみてみてもヘッダーにユーザー名のみしか表示がされずエラーも特になく困っています。

該当のソースコード

base.html

1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>{% block title %}口コミサイト{% endblock %}</title> 8 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> 9 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"> 10 <link rel="stylesheet" href="style.css"> 11</head> 12 13<body> 14 <!-- ヘッダー --> 15 <header> 16 <nav class="navbar navbar-expand-lg navbar-light bg-light"> 17 <a class="navbar-brand" href="{{ url_for('review.index') }}">口コミサイト</a> 18 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" 19 aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> 20 <span class="navbar-toggler-icon"></span> 21 </button> 22 <div class="collapse navbar-collapse" id="navbarNav"> 23 <ul class="navbar-nav ml-auto"> 24 <li class="nav-item"> 25 <a class="nav-link" href="{{ url_for('map.map') }}">MAP</a> 26 </li> 27 <li class="nav-item"> 28 <a class="nav-link" href="{{ url_for('shop.shop_list') }}">Shop Info</a> 29 </li> 30 {% if 'auth.user' in session %} 31 <li class="nav-item"> 32 <a class="nav-link" href="{{ url_for('user.logout') }}">Sign Out</a> 33 </li> 34 <li class="nav-item"> 35 <a class="nav-link" href="#">{{ session['auth.user']['username'] }}さん : {{ session['auth.user']['authority'] }} 36 <!-- {% for authority in authorities %} 37 {% if authority.id == session['auth.user']['authority_id'] %} 38 {{ authority.authority }} 39 {% endif %} 40 {% endfor %} --> 41 </a> 42 </li> 43 {% else %} 44 <li class="nav-item"> 45 <a class="nav-link" href="{{ url_for('user.login') }}">Login</a> 46 </li> 47 <li class="nav-item"> 48 <a class="nav-link" href="{{ url_for('user.signup') }}">Sign Up</a> 49 </li> 50 {% endif %} 51 </ul> 52 </div> 53 </nav> 54 </header> 55 56 <!-- メインコンテンツ --> 57 <main class="container mt-4"> 58 {% block content %} 59 {% endblock %} 60 </main> 61 62 <!-- フッター --> 63 <footer class="mt-4 py-2 bg-light text-center"> 64 <p>&copy; 口コミサイト footer.</p> 65 </footer> 66 67 <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> 68 <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js"></script> 69 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> 70 <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAiSkbTdJpE_vTsWus74whj0TezP-Eak6s&callback=initMap" defer></script> 71</body> 72 73</html> 74

user_view.py

1# ルーティングとテンプレートのレンダリングに特化 2from flask import Blueprint, render_template, redirect, flash, url_for, session 3from forms import SignupForm, LoginForm 4from service.user_service import create_user, authenticate_user, logout_user 5 6 7user_blueprint = Blueprint('user', __name__) 8 9 10@user_blueprint.route("/signup", methods=['GET', 'POST']) 11def signup(): 12 form = SignupForm() 13 if form.validate_on_submit(): 14 success, message = create_user(form.username.data, form.email.data, form.password.data) 15 if not success: 16 flash(message) 17 return redirect(url_for('user.signup')) 18 19 flash(message) 20 return redirect(url_for('review.index')) 21 22 return render_template('user/signup.html', form=form) 23 24 25@user_blueprint.route("/login", methods=['GET', 'POST']) 26def login(): 27 form = LoginForm() 28 if form.validate_on_submit(): 29 success, user_data = authenticate_user(form.email.data, form.password.data) 30 if not success: 31 flash(user_data) 32 return redirect(url_for('user.login')) 33 34 session['auth.user'] = user_data 35 return redirect(url_for('review.index')) 36 37 return render_template('user/signin.html', form=form) 38 39 40@user_blueprint.route("/logout", methods=['GET']) 41def logout(): 42 logout_user() 43 return redirect(url_for('review.index')) 44

user_service.py

1from models.users import db, User 2from werkzeug.security import generate_password_hash, check_password_hash 3from flask import session 4 5 6def hash_password(original_pass): 7 return generate_password_hash(original_pass) 8 9 10def check_password(hashed_password, password): 11 return check_password_hash(hashed_password, password) 12 13 14def get_model_dict(model): 15 return dict((column.name, getattr(model, column.name)) 16 for column in model.__table__.columns) 17 18 19def create_user(username, email, password): 20 u = User.query.filter_by(email=email).first() 21 if u: 22 return False, 'そのメールアドレスは既に利用されています。' 23 24 user = User(username=username, email=email, password=hash_password(password)) 25 db.session.add(user) 26 db.session.commit() 27 return True, 'ユーザー登録が完了しました。ログインしてください。' 28 29 30def authenticate_user(email, password): 31 u = User.query.filter_by(email=email).first() 32 if u is None or not check_password(u.password, password): 33 return False, 'ユーザー名とパスワードの組み合わせが違います。' 34 35 return True, get_model_dict(u) 36 37 38def logout_user(): 39 session.clear() 40

user_repository.py

1from models.users import db, User 2from werkzeug.security import generate_password_hash, check_password_hash 3 4 5def get_user_by_email(email): 6 return User.query.filter_by(email=email).first() 7 8 9def create_user(email, password): 10 u = get_user_by_email(email) 11 if u: 12 return False, 'そのメールアドレスは既に利用されています。' 13 14 user = User(email=email, password=generate_password_hash(password)) 15 db.session.add(user) 16 db.session.commit() 17 return True, 'ユーザー登録が完了しました。ログインしてください。' 18 19 20def authenticate_user(email, password): 21 u = get_user_by_email(email) 22 if u is None or not check_password_hash(u.password, password): 23 return False, 'ユーザー名とパスワードの組み合わせが違います。' 24 25 return True, u 26 27 28

base.html

1from models.users import db, User 2from werkzeug.security import generate_password_hash, check_password_hash 3 4 5def get_user_by_email(email): 6 return User.query.filter_by(email=email).first() 7 8 9def create_user(email, password): 10 u = get_user_by_email(email) 11 if u: 12 return False, 'そのメールアドレスは既に利用されています。' 13 14 user = User(email=email, password=generate_password_hash(password)) 15 db.session.add(user) 16 db.session.commit() 17 return True, 'ユーザー登録が完了しました。ログインしてください。' 18 19 20def authenticate_user(email, password): 21 u = get_user_by_email(email) 22 if u is None or not check_password_hash(u.password, password): 23 return False, 'ユーザー名とパスワードの組み合わせが違います。' 24 25 return True, u 26

users.py

1from . import db 2from werkzeug.security import generate_password_hash, check_password_hash 3 4class User(db.Model): 5 __tablename__ = 'users' 6 id = db.Column(db.Integer, primary_key=True) 7 username = db.Column(db.String(50), unique=True, nullable=False) 8 email = db.Column(db.String(100), unique=True, nullable=False) 9 password = db.Column(db.String(128), nullable=False) 10 authority_id = db.Column(db.Integer, db.ForeignKey('authority.id'), default=1) 11 authority = db.relationship('Authority', foreign_keys=[authority_id]) 12 13 14 @staticmethod 15 def login(email, password): 16 u = User.query.filter_by(email=email).first() 17 if u and User.verify_password(u.password, password): 18 return u 19 return None 20 21 @staticmethod 22 def verify_password(stored_password, provided_password): 23 return check_password_hash(stored_password, provided_password) 24 25 26class Authority(db.Model): 27 __tablename__ = 'authority' 28 id = db.Column(db.Integer, primary_key=True) 29 authority = db.Column(db.String, nullable=False)

試したこと

base.htmlの{{ session['auth.user']['authority'] }}の中身を調べたところNoneだったのでそもそも取得ができていないのだと思い記述の方法を変えたりして試してみましたが取得ができませんでした。

補足情報(FW/ツールのバージョンなど)

python3 PostgreSQL SQL Alchemy

コメントを投稿

0 コメント