Files
luntan/app/blueprints/auth.py

62 lines
2.6 KiB
Python

import os
from flask import Blueprint, render_template, request, redirect, url_for, flash, current_app
from flask_login import login_user, logout_user, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.utils import secure_filename
from ..extensions import db, login_manager
from ..models import User, Profile, UserStatus
bp = Blueprint("auth", __name__, url_prefix="/auth")
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@bp.route("/register", methods=["GET", "POST"])
def register():
if request.method == "POST":
email = request.form.get("email")
username = request.form.get("username")
password = request.form.get("password")
photo = request.files.get("identity_photo")
if not email or not username or not password or not photo:
flash("请完整填写信息并上传身份照片")
return redirect(url_for("auth.register"))
if User.query.filter_by(email=email).first() or User.query.filter_by(username=username).first():
flash("邮箱或用户名已存在")
return redirect(url_for("auth.register"))
filename = secure_filename(photo.filename)
upload_dir = os.path.join(current_app.config["UPLOAD_FOLDER"], "identity")
path = os.path.join(upload_dir, filename)
photo.save(path)
user = User(email=email, username=username, password_hash=generate_password_hash(password), status=UserStatus.pending, identity_photo_path=path)
db.session.add(user)
db.session.flush()
profile = Profile(user_id=user.id)
db.session.add(profile)
db.session.commit()
flash("注册提交成功,请等待管理员审核")
return redirect(url_for("auth.login"))
return render_template("auth/register.html")
@bp.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
email = request.form.get("email")
password = request.form.get("password")
user = User.query.filter_by(email=email).first()
if not user or not check_password_hash(user.password_hash, password):
flash("登录失败")
return redirect(url_for("auth.login"))
if user.status != UserStatus.approved:
flash("账户未审核通过")
return redirect(url_for("auth.login"))
login_user(user)
return redirect(url_for("feed.discover"))
return render_template("auth/login.html")
@bp.route("/logout")
def logout():
logout_user()
return redirect(url_for("auth.login"))