現在Flaskを用いてソースコードのメモアプリを作成中です。今回教えて欲しいこととしては、Flaskのログイン機能に関してです。
具体的には、ユーザを新規登録してから、ログインするとメモアプリのトップページに進む仕様になっており、そこからメモの変更や削除、新規登録をする際に、「Unauthorized」と出てしまいます。
恐らく、@login_requiredが原因かと思われるのですが、トップページにも追加しているので、ログイン自体は出来ていると思われます。また、「Unauthorized」となった際にフォームを再送信するときちんとメモの更新、削除が行われており、メモアプリとしては機能しています。
以下、実際のメモアプリと、ソースコードになります。
https://memoprogram.herokuapp.com/login
app.py
1from crypt import methods 2from email.policy import default 3from enum import unique 4from flask import Flask 5from flask import render_template, request, redirect 6from flask_sqlalchemy import SQLAlchemy 7from flask_login import UserMixin, LoginManager, login_user, login_required, logout_user 8from flask_bootstrap import Bootstrap 9 10from werkzeug.security import generate_password_hash, check_password_hash 11from datetime import datetime 12import os 13import pytz 14 15app = Flask(__name__) 16app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///memo.db' 17app.config['SECRET_KEY'] = os.urandom(24) 18db = SQLAlchemy(app) 19bootstrap = Bootstrap(app) 20 21login_manager = LoginManager() 22login_manager.init_app(app) 23 24class Post(db.Model): #データベース定義 25 id = db.Column(db.Integer, primary_key=True) 26 title = db.Column(db.String(50), nullable=False) 27 url = db.Column(db.String(100), nullable=True) 28 body = db.Column(db.String(500), nullable=False) 29 created_at = db.Column(db.DateTime, nullable=False, default=datetime.now(pytz.timezone('Asia/Tokyo'))) 30 31class User(UserMixin, db.Model): #データベース定義 32 id = db.Column(db.Integer, primary_key=True) 33 user_name = db.Column(db.String(20), nullable=False, unique=True) 34 password = db.Column(db.String(30), nullable=False) 35 36@login_manager.user_loader 37def load_user(user_id): #セッション情報取得 38 return User.query.get(int(user_id)) 39 40 41 42@app.route("/", methods=["GET", "POST"]) 43@login_required #デコレータ追加 44def index(): 45 if request.method == "GET": 46 posts = Post.query.all() #Post内の全てのデータをリスト形式で取得 47 return render_template("index.html", posts=posts) 48 49@app.route("/signup", methods=["GET", "POST"]) 50def signup(): 51 if request.method == "GET": 52 return render_template("signup.html") 53 else: 54 user_name = request.form.get("user_name") #formでPOSTされたデータを取得 55 password = request.form.get("password") 56 57 user = User(user_name=user_name, password=generate_password_hash(password, method='sha256')) #パスワードをハッシュ化 58 59 db.session.add(user) #データベースに追加 60 db.session.commit() #コミットしないと追加、保存されない 61 return redirect("/login") #ログイン画面へリダイレクト 62 63@app.route("/login", methods=["GET", "POST"]) 64def login(): 65 if request.method == "GET": 66 return render_template("login.html") 67 else: 68 user_name = request.form.get("user_name") #formでPOSTされたデータを取得 69 password = request.form.get("password") 70 71 if (user_name == None) or (password == None): 72 return redirect('/login') 73 else: 74 user = User.query.filter_by(user_name=user_name).first() #ユーザ名を取ってくる 75 if check_password_hash(user.password, password): #パスワードハッシュがあっている場合 76 login_user(user) #userにログイン 77 return redirect("/") #初期画面へリダイレクト 78 79@app.route("/logout") 80@login_required #デコレータ追加 81def logout(): 82 logout_user() 83 return redirect("/login") 84 85@app.route("/create", methods=["GET", "POST"]) 86@login_required #デコレータ追加 87def create(): 88 if request.method == "GET": 89 return render_template("create.html") 90 else: 91 title = request.form.get("title") #formでPOSTされたデータを取得 92 url = request.form.get("url") 93 body = request.form.get("body") 94 95 post = Post(title=title, url=url, body=body) 96 97 db.session.add(post) #データベースに追加 98 db.session.commit() #コミットしないと追加、保存されない 99 return redirect("/") #初期画面へリダイレクト 100 101@app.route("/<int:id>/update", methods=["GET", "POST"]) 102@login_required #デコレータ追加 103def update(id): #post.idがidに入る 104 post = Post.query.get(id) #Post内の特定のデータをリスト形式で取得 105 if request.method == "GET": 106 return render_template("update.html", post=post) 107 else: 108 post.title = request.form.get("title") #formでPOSTされたデータを取得 109 post.url = request.form.get("url") 110 post.body = request.form.get("body") 111 112 db.session.commit() #更新するときはコミットのみでOK 113 return redirect("/") #初期画面へリダイレクト 114 115@app.route("/<int:id>/delete", methods=["GET"]) 116@login_required #デコレータ追加 117def delete(id): #post.idがidに入る 118 post = Post.query.get(id) #Post内の特定のデータをリスト形式で取得 119 120 db.session.delete(post) #データベースのデータを削除 121 db.session.commit() 122 return redirect("/") #初期画面へリダイレクト
回答1件
あなたの回答
tips
プレビュー