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

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

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

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

Python

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

Q&A

1回答

292閲覧

Flaskのアプリにログインができない

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

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

Python

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

0グッド

0クリップ

投稿2023/05/10 07:47

編集2023/05/10 08:07

登録したユーザーで、ログインを行おうとしております。
signupページからユーザー登録を行い、登録したユーザーでloginページからログインを
行おうとしておりますが、loginボタンを押しても、「Unauthorized」が表示され、/へ遷移しません。
どこが、どう間違っているのか原因が分からない状況です。

作成したユーザーはDBに登録されております。
また
@login_requiredを全てコメント化すると、loginが可能となります。

どなたかご教示の程、よろしくお願い致します。

app.py

python

1from datetime import datetime 2from flask import Flask, render_template, request, redirect 3from flask_sqlalchemy import SQLAlchemy 4from flask_login import UserMixin, LoginManager, login_user, logout_user, login_required 5import os 6from werkzeug.security import generate_password_hash, check_password_hash 7 8 9app = Flask(__name__) 10app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db' 11app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 12 13app.config['SECRET_KYE'] = os.urandom(24) 14db = SQLAlchemy(app) 15 16login_manager = LoginManager() 17login_manager.init_app(app) 18 19class Post(db.Model): 20 id = db.Column(db.Integer, primary_key=True) 21 title = db.Column(db.String(30), nullable=False) 22 detail = db.Column(db.String(100)) 23 due = db.Column(db.DateTime, nullable=False) 24 25 26class User(UserMixin, db.Model): 27 id = db.Column(db.Integer, primary_key=True) 28 username = db.Column(db.String(30), nullable=False, unique=True) 29 password = db.Column(db.String(18), nullable=False) 30 31@login_manager.user_loader 32def load_user(user_id): 33 return User.query.get(int(user_id)) 34 35@app.route('/', methods=['GET', 'POST']) 36@login_required 37def index(): 38 if request.method == 'GET': 39 posts = Post.query.order_by(Post.due).all() 40 return render_template('index.html', posts=posts) 41 else: 42 title = request.form.get('title') 43 detail = request.form.get('detail') 44 due = request.form.get('due') 45 46 47 due = datetime.strptime(due, '%Y-%m-%d') 48 new_post = Post(title=title, detail=detail, due=due) 49 50 db.session.add(new_post) 51 db.session.commit() 52 53 return redirect('/') 54 55@app.route('/create') 56@login_required 57def create(): 58 return render_template('create.html') 59 60# signup 61@app.route('/signup', methods=['GET', 'POST']) 62def signup(): 63 if request.method == 'POST': 64 username = request.form.get('username') 65 password = request.form.get('password') 66 67 user = User(username=username, password=generate_password_hash(password, method='sha256')) 68 69 db.session.add(user) 70 db.session.commit() 71 return redirect('/login') 72 else: 73 return render_template('signup.html') 74 75# login 76@app.route('/login', methods=['GET', 'POST']) 77def login(): 78 if request.method == 'POST': 79 username = request.form.get('username') 80 password = request.form.get('password') 81 82 user = User.query.filter_by(username=username).first() 83 84 85 if check_password_hash(user.password, password): 86 login_user(user) 87 return redirect('/') 88 else: 89 return render_template('login.html') 90 91 92@app.route('/logout') 93@login_required 94def logout(): 95 logout_user() 96 return redirect('/login') 97 98@app.route('/detail/<int:id>') 99@login_required 100def read(id): 101 post = Post.query.get(id) 102 return render_template('detail.html', post=post) 103 104@app.route('/update/<int:id>', methods=['GET', 'POST']) 105@login_required 106def update(id): 107 post = Post.query.get(id) 108 if request.method == 'GET': 109 110 return render_template('update.html', post=post) 111 else: 112 post.title = request.form.get('title') 113 post.detail = request.form.get('detail') 114 post.due = datetime.strptime(request.form.get('due'), '%Y-%m-%d') 115 116 db.session.commit() 117 return redirect('/') 118 119@app.route('/delete/<int:id>') 120@login_required 121def delete(id): 122 post = Post.query.get(id) 123 db.session.delete(post) 124 db.session.commit() 125 126 return redirect('/') 127 128if __name__ == '__main__': 129 app.run(debug=True)

login.html

html

1{% extends "base.html" %} 2 3{% block content %} 4<h1>ログイン画面</h1> 5<form action="/" method="POST"> 6 <label for="username">ユーザー名</label> 7 <input type="text" name="username"> 8 <label for="password">パスワード</label> 9 <input type="password" name="password"> 10 <input type="submit" value="ログイン"> 11</form> 12 13{% endblock %}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/05/10 08:07

@login_requiredを全てコメント化すると、loginが可能となります。
guest

回答1

0

flask-loginのドキュメントを参照ください。

Your Class部分に記載がありますが、ここにあるメソッドやプロパティを実装する必要があります。
実装されていない場合、ログインできません。

Anonymous Usersには、匿名ユーザの場合のステータスの例があり、以下のような感じです。

is_active is False is_authenticated is False is_anonymous is True get_id() returns None

ログインが成功しているユーザは、匿名ではないので、上記の逆(例えば、activeはTrue、authenticatedはTrue、anonymousはFalse、get_idは管理しているIDなど)を返すようなものを実装すればOKです。

また、今回は大丈夫ですが、ユーザクラス(というかモデル)の、id列は、変数名をidとする必要がありますので、user_idとかにしている場合はidとしてください。

投稿2023/05/10 11:20

FiroProchainezo

総合スコア2401

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問