質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.41%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1104閲覧

Flask login_requiredが意図し通りに動かない

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/02/23 07:13

ログインしたユーザーだけがアクセスできるように、login_requiredの設定を行いました。

想定動作としては、
以下のコード内では、user_maintenance.htmlへ未ログインでアクセスした場合、loginページに転送されるように設定をおこなったのですが、ブラウザには、
「Unauthorized
The server could not verify that you are authorized to access the URL requested. You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.」が表示されてしまいます。

ずっと、調べておりますが、原因が分からない状況です。

ご教示、アドバイスの程、よろしくお願い致します。

python

1# app.py抜粋 2 3from flask import Flask, render_template, url_for, redirect, session, flash, request 4from flask_wtf import FlaskForm 5from wtforms import ValidationError, StringField, PasswordField, SubmitField 6from wtforms.validators import DataRequired, Email, EqualTo 7from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required 8from werkzeug.security import generate_password_hash, check_password_hash 9 10import os 11from flask import Flask 12from flask_sqlalchemy import SQLAlchemy 13from flask_migrate import Migrate 14from datetime import datetime 15from pytz import timezone 16 17app = Flask(__name__) 18 19app.config['SECRET_KEY'] = 'mysecretkey' 20app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.sqlite' 21app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 22 23# DBの作成とmaigratin 24db = SQLAlchemy(app) 25Migrate(app, db) 26 27login_manager = LoginManager() 28login_manager.init_app(app) 29login_manager.login_vew='login' 30 31@login_manager.user_loader 32def load_user(user_id): 33 return User.query.get(user_id) 34 35class User(db.Model, UserMixin): 36 __tablename__ = 'users' 37 38 id = db.Column(db.Integer, primary_key=True) 39 email = db.Column(db.String(64), unique=True, index=True) 40 username = db.Column(db.String(64), unique=True, index=True) 41 password_hash = db.Column(db.String(128)) 42 administrator = db.Column(db.String(1)) 43 post = db.relationship('BlogPost', backref='author', lazy='dynamic') 44 45 46 # def __init__(self, email, username, password_hash, administrator): 47 def __init__(self, email, username, password, administrator): 48 self.email = email 49 self.username = username 50 # self.password_hash = password_hash 51 self.password = password 52 self.administrator = administrator 53 54 55 def __repr__(self): 56 return f"UserName: {self.username}" 57 58 # パスワードを比較 59 def check_password(self, password): 60 return check_password_hash(self.password_hash, password) 61 62 # ゲッターの設定 63 # PWを返さないようにすることで、ハッシュ化前のPWは直接参照できなくなる 64 @property 65 def password(self): 66 raise AttributeError('password is not a readable attribute') 67 68 # セッターの設定 69 @password.setter 70 def password(self, password): 71 # self.password_hashのハッシュ化されたPWがDBに保存される 72 self.password_hash = generate_password_hash(password) 73 74 75@app.route('/login', methods=['GET', 'POST']) 76def login(): 77 form = LoginForm() 78 if form.validate_on_submit(): 79 user = User.query.filter_by(email=form.email.data).first() 80 # 該当するユーザーが存在する場合 81 if user is not None: 82 if user.check_password(form.password.data): 83 # login_userの引数にuserを渡すことでログインが行われる 84 login_user(user) 85 # loginしたらクエリ-文字列のnextの値を取得 86 next = request.args.get('next') 87 if next == None or not next[0] == '/': 88 next = url_for('user_maintenance') 89 return redirect(next) 90 else: 91 flash('パスワードが一致しません') 92 else: 93 flash('入力されたユーザーは存在しません') 94 return render_template('login.html', form=form) 95 96@app.route('/user_maintenance') 97@login_required 98def user_maintenance(): 99 page = request.args.get('page', 1, type=int) 100 users = User.query.order_by(User.id).paginate(page=page, per_page=10) 101 return render_template('user_maintenance.html', users=users) 102 103if __name__ == '__main__': 104 app.run(debug=True) 105

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

前の質問でも回答しましたが、Flask-Loginの、"Your User Class"にある通り、is_authenticatedなどのプロパティを実装しないと動きません。
まず、プロパティを実装してください。

投稿2023/02/23 10:25

FiroProchainezo

総合スコア2402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.41%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問