実現したいこと
ブログアプリの動作確認をしたい。
前提
Flaskでブログアプリを作成しようとしています。
signup機能を作り終わりました。そこで、ユーザー名とパスワードの両方を”a”入れて新規登録ボタンを押したところ以下のエラーが発生しました。
発生している問題・エラーメッセージ
エラーメッセージ
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) table user has no column named password
[SQL: INSERT INTO user (username, password) VALUES (?, ?)]
[parameters: ('a', 'sha256$Y8vcCVMLjz5Ztb0d$6e4b06e517c511fa4b5bbec390ec01dcfb71ae3e2d4616c979912d3344c0327b')]
(Background on this error at: https://sqlalche.me/e/14/e3q8)
app.py
1### 該当のソースコード 2```from enum import unique 3from flask import Flask 4from flask import render_template, request, redirect 5from flask_sqlalchemy import SQLAlchemy 6from flask_login import UserMixin, LoginManager, login_user, logout_user, login_required 7from werkzeug.security import generate_password_hash, check_password_hash 8import os 9 10from datetime import datetime 11import pytz 12 13app = Flask(__name__) 14app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db' 15app.config['SECRET_KEY'] = os.urandom(24) 16db = SQLAlchemy(app) 17 18login_manager = LoginManager() 19login_manager.init_app(app) 20 21class Post(db.Model): 22 id = db.Column(db.Integer, primary_key=True) 23 title = db.Column(db.String(30), nullable=False) 24 body = db.Column(db.String(300), nullable=False) 25 created_at = db.Column(db.DateTime, nullable=False, default=datetime.now(pytz.timezone("Asia/Tokyo"))) 26 27class User(UserMixin, db.Model): 28 id = db.Column(db.Integer, primary_key=True) 29 username = db.Column(db.String(30), unique=True) 30 password = db.Column(db.String(12)) 31 32@login_manager.user_loader 33def load_user(user_id): 34 return User.query.get(int(user_id)) 35 36@app.route('/', methods=['GET','POST'])#POST:何かを新規作成したときに用いる:formを送信したときなどGET:webページにアクセスしているときに使用する 37@login_required 38def index(): 39 if request.method == 'GET': 40 posts = Post.query.all() 41 return render_template('index.html', posts=posts) 42 43@app.route('/signup', methods=['GET', 'POST']) 44def signup(): 45 if request.method == 'POST': 46 username = request.form.get('username') 47 password = request.form.get('password') 48 49 user = User(username=username, password=generate_password_hash(password, method='sha256')) 50 51 db.session.add(user) 52 db.session.commit() 53 return redirect('/login') 54 else: 55 return render_template('signup.html') 56 57@app.route('/login', methods=['GET','POST']) 58def login(): 59 if request.method == 'POST': 60 username = request.form.get('username') 61 password = request.form.get('password') 62 63 user = User.query.filter_by(username = username).first() 64 if check_password_hash(user.password, password): 65 login_user(user) 66 return redirect('/') 67 else: 68 return render_template('login.html') 69 70@app.route('/logout') 71@login_required #loginしているユーザーしかログインできない 72def logout(): 73 logout_user() 74 return redirect('/login') 75 76@app.route('/create', methods=['GET','POST']) 77@login_required 78def create(): 79 if request.method == 'POST': 80 title = request.form.get('title') 81 body = request.form.get('body') 82 83 post = Post(title=title, body=body) 84 85 db.session.add(post) 86 db.session.commit() 87 return redirect("/") 88 else: 89 return render_template('create.html') 90 91@app.route('/<int:id>/update', methods=['GET','POST']) 92@login_required 93def update(id): 94 post = Post.query.get(id) 95 if request.method == 'GET': 96 return render_template('update.html', post=post) 97 else: 98 post.title = request.form.get('title') 99 post.body = request.form.get('body') 100 101 db.session.commit() 102 return redirect("/") 103 104@app.route('/<int:id>/delete', methods=['GET']) 105@login_required 106def delete(id): 107 post = Post.query.get(id) 108 109 db.session.delete(post) 110 db.session.commit() 111 return redirect('/') 112
signup.html
1{% extends 'base.html' %} 2{% block content %} 3<h1>ユーザー登録</h1> 4<form method="POST"> 5 <label for="">ユーザー名</label> 6 <input type="text" name="username"> 7 <label for="">パスワード</label> 8 <input type="password" name="password"> 9 <input type="submit" value="新規登録"> 10</form> 11{% endblock %}
試したこと
・ https://sqlalche.me/e/14/e3q8 からマイグレーションできていない可能性があると考えたため以下を試しましたが解決には至らなかったです。
bash
1>>> from app import app 2>>> from app import db 3>>> with app.app_context(): 4... db.create_all()
補足情報(FW/ツールのバージョンなど)
windows 10
Python 3.9.12
flask 2.2.3
flask-sqlalchemy 3.0.3
sqlite 3.38.2
模写した動画です。(https://www.youtube.com/watch?v=VtJ-fGm4gNg)
どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/03/13 11:41