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'] = False11 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_loader31def load_user(user_id):32 return User.query.get(int(user_id))33 34@app.route('/', methods=['GET', 'POST'])35@login_required36def 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_required57def create():58 return render_template('create.html')59 60# signup61@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# login78@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_required95def logout():96 logout_user()97 return redirect('/login')98 99@app.route('/detail/<int:id>')100@login_required101def 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_required107def 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_required122def 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

0 コメント