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'] = False22 23# DBの作成とmaigratin24db = SQLAlchemy(app)25Migrate(app, db)26 27login_manager = LoginManager()28login_manager.init_app(app)29login_manager.login_vew='login'30 31@login_manager.user_loader32def 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_hash51 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 @property65 def password(self):66 raise AttributeError('password is not a readable attribute')67 68 # セッターの設定69 @password.setter70 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_required98def 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

0 コメント