一个简洁高效的Flask用户管理示例

Flask-Login 是 Flask 的用户管理扩展,提供 用户身份验证、会话管理、权限控制 等功能。

适用于

用户登录、登出

记住用户("记住我" 功能)

限制未登录用户访问某些页面

用户会话管理

1. 安装 Flask-Login

bash 复制代码
pip install flask-login flask-sqlalchemy

main.py

python 复制代码
from flask import Flask, render_template, redirect, url_for, request, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user

app = Flask(__name__)

# 配置 Flask 和数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'  # 使用 SQLite 数据库
app.config['SECRET_KEY'] = 'your_secret_key'  # Flask-Login 需要 secret key
db = SQLAlchemy(app)
login_manager = LoginManager(app)

# 定义用户模型
class User(UserMixin, db.Model):  # UserMixin 提供 Flask-Login 必需的方法
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(100), unique=True, nullable=False)
    password = db.Column(db.String(200), nullable=False)  # 真实应用需加密密码

# 创建数据库表(仅需运行一次)
with app.app_context():
    db.create_all()

# Flask-Login 加载用户的回调函数
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))  # 通过 ID 获取用户


@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')

        if not username or not password:
            flash("用户名和密码不能为空!")
            return redirect(url_for('register'))

        # 检查用户是否已存在
        existing_user = User.query.filter_by(username=username).first()
        if existing_user:
            flash("用户名已存在,请选择其他用户名")
            return redirect(url_for('register'))

        # 创建新用户并保存到数据库
        new_user = User(username=username, password=password)  # 这里应加密密码
        db.session.add(new_user)
        db.session.commit()

        flash("注册成功,请登录!")
        return redirect(url_for('login'))

    return render_template('register.html')


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')

        # 查找用户
        user = User.query.filter_by(username=username).first()
        if user and user.password == password:  # 这里应使用加密密码验证
            login_user(user)  # 登录用户
            flash("登录成功!")
            return redirect(url_for('dashboard'))

        flash("用户名或密码错误")
        return redirect(url_for('login'))

    return render_template('login.html')


@app.route('/dashboard')
@login_required  # 保护此路由,未登录用户无法访问
def dashboard():
    return f"欢迎 {current_user.username}!这是您的仪表盘。 <a href='/logout'>登出</a>"


@app.route('/logout')
@login_required
def logout():
    logout_user()
    flash("您已成功退出!")
    return redirect(url_for('login'))


if __name__ == "__main__":
    app.run(debug=True)

templates/login.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post">
    <label>用户名:</label>
    <input type="text" name="username" required>
    <label>密码:</label>
    <input type="password" name="password" required>
    <button type="submit">登录</button>
</form>
</body>
</html>

templates/register.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post">
      <label>用户名:</label>
      <input type="text" name="username" required>
      <label>密码:</label>
      <input type="password" name="password" required>
      <button type="submit">注册</button>
    </form>
</body>
</html>

运行,然后访问:

注册http://127.0.0.1:5000/register

登录http://127.0.0.1:5000/login

仪表盘(必须登录):http://127.0.0.1:5000/dashboard

登出http://127.0.0.1:5000/logout

相关推荐
爱学堂IT分享6 小时前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
benchmark_cc6 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库7 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
码事漫谈8 小时前
类型即世界:一个 C++ 程序员的本体论入门
后端
2601_962382438 小时前
python快乐编程网络爬虫课后答案
python·网络爬虫·学习工具·课后答案·刷题app
Rain的Java大神之路8 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
鹏哥带你干乡墅8 小时前
优选乡墅赋能培训平台如何帮助提升乡村建设?
大数据·人工智能·python
veminhe9 小时前
python调用接口获取网络信息
python
Allen_LVyingbo10 小时前
医疗AI基础2026-构建可靠智能体的编程路径(上)
大数据·数据库·人工智能·python·自动化
IT_陈寒10 小时前
Python的多线程居然是个假把式?搞清GIL让我少熬三天夜
前端·人工智能·后端