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

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

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

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

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

Q&A

解決済

1回答

478閲覧

Flask DBへ登録されない

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

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

0グッド

0クリップ

投稿2023/05/03 07:53

singup(ユーザー登録ページ)でユーザー登録を行うと、login.html(ログインページ)へ遷移するはずですが、
なぜか、DBにユーザーが登録されず、Unauthorizedが表示されてしまいます。

何度もコードを見直しておりますが、エラー等がなく原因が分からない状況です。
どなたかご教示の程、よろしくお願い致します。

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 5from werkzeug.security import generate_password_hash, check_password_hash 6import os 7 8app = Flask(__name__) 9app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db' 10app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 11 12app.config['SECRET_KYE'] = os.urandom(24) 13db = SQLAlchemy(app) 14 15login_manager = LoginManager() 16login_manager.init_app(app) 17 18class Post(db.Model): 19 id = db.Column(db.Integer, primary_key=True) 20 title = db.Column(db.String(30), nullable=False) 21 detail = db.Column(db.String(100)) 22 due = db.Column(db.DateTime, nullable=False) 23 24 25class User(UserMixin, db.Model): 26 id = db.Column(db.Integer, primary_key=True) 27 username = db.Column(db.String(30), nullable=False, unique=True) 28 password = db.Column(db.String(18), nullable=False) 29 30@login_manager.user_loader 31def load_user(user_id): 32 return User.query.get(int(user_id)) 33 34@app.route('/', methods=['GET', 'POST']) 35@login_required 36def index(): 37 if request.method == 'GET': 38 # posts = Post.query.all() 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=password)ではなく↓ 68 # PWを暗号化する。 69 user = User(username=username, password=generate_password_hash(password, method='sha256')) 70 71 db.session.add(user) 72 db.session.commit() 73 return redirect('/login') 74 else: 75 return render_template('signup.html') 76 77# login 78@app.route('/login', methods=['GET', 'POST']) 79def login(): 80 if request.method == 'POST': 81 username = request.form.get('username') 82 password = request.form.get('password') 83 84 user = User.query.filter_by(username=username).first() 85 86 if check_password_hash(user.password, password): 87 login_user(user) 88 return redirect('/') 89 else: 90 return render_template('login.html') 91 92 93@app.route('/logout') 94@login_required 95def logout(): 96 logout_user() 97 return redirect('/login') 98 99@app.route('/detail/<int:id>') 100@login_required 101def read(id): 102 post = Post.query.get(id) 103 return render_template('detail.html', post=post) 104 105@app.route('/update/<int:id>', methods=['GET', 'POST']) 106@login_required 107def update(id): 108 post = Post.query.get(id) 109 if request.method == 'GET': 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 # HTMLから渡されるdueは、文字列型なのでキャストする 115 post.due = datetime.strptime(request.form.get('due'), '%Y-%m-%d') 116 117 db.session.commit() 118 return redirect('/') 119 120@app.route('/delete/<int:id>') 121@login_required 122def delete(id): 123 post = Post.query.get(id) 124 db.session.delete(post) 125 db.session.commit() 126 127 return redirect('/') 128 129if __name__ == '__main__': 130 app.run(debug=True) 131

signup.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 %} 14

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

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

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

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

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

guest

回答1

0

ベストアンサー

html

1<form action="/" method="POST">

actionが/となっているためと考えられます。
このformのactionが/で間違い無いですか?

/signupのif文の真側に送りたいのではないですか?

/の場合、以下を指していますが、@login_requiredが指定されているので、ログインされていないとアクセスできません。

python

1@app.route('/', methods=['GET', 'POST']) 2@login_required 3def index():

FlaskでWebを作成する場合、HTMLではjinja2を使用できます。
jinja2で、Flask側で作ったURLを指定する場合、url_for()を使うのが便利です。

投稿2023/05/03 08:35

FiroProchainezo

総合スコア2402

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

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

退会済みユーザー

退会済みユーザー

2023/05/03 10:26

<form action="/" method="POST">を <form action="/signup" method="POST">に修正しDB登録され、login画面に遷移できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問