如何在 Flask 中实现用户认证?

devtools/2025/1/25 1:57:49/

Flask 中实现用户认证,可以通过以下方式完成:

基础步骤

  1. 设置用户数据库:存储用户信息(如用户名、密码)。
  2. 注册功能:允许用户创建账号。
  3. 登录功能:验证用户输入的凭据。
  4. 会话管理:使用 Flask 的 session 或第三方工具管理登录状态。
  5. 登出功能:清除用户的登录状态。

实现步骤

以下是一个完整示例,展示如何实现用户认证功能:

1. 项目文件结构
flask_auth/
├── app.py         # 主应用
├── auth/          # 用户认证模块
│   ├── __init__.py
│   ├── routes.py
├── templates/     # HTML 模板文件
│   ├── login.html
│   ├── register.html
│   ├── dashboard.html

2. 安装必要库

安装 Flask 和 Flask-WTF(表单处理):

pip install flask flask-wtf werkzeug

3. 配置应用(app.py)

app.py:

python">from flask import Flask
from auth.routes import auth_blueprintapp = Flask(__name__)# 配置密钥,用于会话管理
app.secret_key = 'your_secret_key'# 注册蓝图
app.register_blueprint(auth_blueprint)if __name__ == '__main__':app.run(debug=True)

4. 用户认证路由(auth/routes.py)

auth/routes.py:

python">from flask import Blueprint, render_template, request, redirect, url_for, session, flash
from werkzeug.security import generate_password_hash, check_password_hash# 模拟数据库(在生产环境中使用真正的数据库)
users = {}auth_blueprint = Blueprint('auth', __name__)# 注册功能
@auth_blueprint.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form['username']password = request.form['password']if username in users:flash('Username already exists!')return redirect(url_for('auth.register'))# 存储哈希后的密码users[username] = generate_password_hash(password)flash('Registration successful! You can now log in.')return redirect(url_for('auth.login'))return render_template('register.html')# 登录功能
@auth_blueprint.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']# 检查用户是否存在if username not in users or not check_password_hash(users[username], password):flash('Invalid username or password!')return redirect(url_for('auth.login'))# 登录成功,设置会话session['user'] = usernameflash('Login successful!')return redirect(url_for('auth.dashboard'))return render_template('login.html')# 用户主页
@auth_blueprint.route('/dashboard')
def dashboard():if 'user' not in session:flash('Please log in first!')return redirect(url_for('auth.login'))return render_template('dashboard.html', username=session['user'])# 登出功能
@auth_blueprint.route('/logout')
def logout():session.pop('user', None)flash('You have been logged out.')return redirect(url_for('auth.login'))

5. HTML 模板文件

templates/register.html:

<!DOCTYPE html>
<html>
<head><title>Register</title></head>
<body><h1>Register</h1><form method="post"><label>Username:</label><input type="text" name="username" required><label>Password:</label><input type="password" name="password" required><button type="submit">Register</button></form><a href="{{ url_for('auth.login') }}">Already have an account? Login</a>
</body>
</html>

templates/login.html:

<!DOCTYPE html>
<html>
<head><title>Login</title></head>
<body><h1>Login</h1><form method="post"><label>Username:</label><input type="text" name="username" required><label>Password:</label><input type="password" name="password" required><button type="submit">Login</button></form><a href="{{ url_for('auth.register') }}">Don't have an account? Register</a>
</body>
</html>

templates/dashboard.html:

<!DOCTYPE html>
<html>
<head><title>Dashboard</title></head>
<body><h1>Welcome, {{ username }}</h1><a href="{{ url_for('auth.logout') }}">Logout</a>
</body>
</html>

功能说明

  1. 注册功能
    • 用户输入用户名和密码。
    • 密码会使用 werkzeug.security.generate_password_hash 进行加密存储。
  2. 登录功能
    • 用户输入用户名和密码。
    • 使用 check_password_hash 检查密码是否正确。
    • 登录成功后,将用户信息存入 session
  3. 会话管理
    • 使用 Flask 的 session 来存储登录状态。
    • 用户的会话在浏览器关闭或登出后清除。
  4. 登出功能
    • 清除用户的 session 信息。

增强功能

  1. 引入数据库
    • 使用 Flask-SQLAlchemy 替代内存中的 users 数据结构。
  2. 验证码
    • 使用第三方库(如 reCAPTCHA)提高安全性。
  3. 限制登录尝试次数
    • 防止暴力破解。
  4. 使用 Flask-Login
    • 一个专门的扩展,用于简化用户登录管理。
  5. JWT Token
    • 对于 RESTful API,使用 JWT(JSON Web Token)代替 session

这个示例提供了一个基础用户认证实现,适合小型项目或快速开发。在生产环境中,请结合数据库和更高级的安全措施进行优化!


http://www.ppmy.cn/devtools/153279.html

相关文章

Java复习第四天

一、代码题 1.相同的树 (1)题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1: 输入:p[1,2,3]&#xff0c;q[1,2,3] 输出:true示例 2: 输…

领域驱动设计(DDD)Spring Boot 3 实现 二

使用 Spring Boot 3 实现领域驱动设计&#xff08;DDD&#xff09;是一种很自然的选择&#xff0c;因为 Spring 提供了良好的生态支持&#xff0c;特别是在分层架构、依赖管理、事件驱动等方面。以下是如何在 Spring Boot 3 中结合 DDD 进行开发的详细指南&#xff1a; 项目结构…

在Unity中使用大模型进行离线语音识别

文章目录 1、Vosk下载下载vosk-untiy-asr下载模型在项目中使用语音转文字音频转文字2、whisper下载下载unity项目下载模型在unity中使用1、Vosk 下载 下载vosk-untiy-asr Github链接:https://github.com/alphacep/vosk-unity-asr 进不去Github的可以用网盘 夸克网盘链接:h…

【Django】多个APP设置独立的URL

目录 方法一&#xff1a;各个App下设置自己的URL 1、在各自的App当中创建urls.py文件​编辑 2、在主urls当中包含子url 3、各App的urls中设置url 4、设置后台函数 5、最终结果 总结&#xff1a; 方法二&#xff1a;利用as方法&#xff0c;在总的URL中对views重命名 实…

我的世界(Minecraft)计算器python源码

我的世界(Minecraft)计算器python源码 1.介绍 使用教程 博客&#xff1a;【Python】python实现我的世界(Minecraft)计算器视频&#xff1a;Python实现我的世界(Minecraft)计算器(附源码与教程) 2.源码 文件一 # CreateBigScreen.py (创建大屏幕并返回大屏幕坐标)from m…

用Zig开发Web后端独特好处

在 Web 后端开发中&#xff0c;使用 Zig 语言可以带来一些独特的好处&#xff0c;尤其是在内存管理方面。 竞技场分配器&#xff08;Arena Allocator&#xff09;&#xff1a; 每个传入的请求都会创建一个竞技场分配器&#xff0c;并将其传递给处理程序。这意味着在处理请求时…

不同IO模型服务器的简单实现

1. 阻塞 I/O&#xff08;Blocking I/O&#xff09; 在阻塞 I/O 模型下&#xff0c;进程在执行 I/O 操作时会被阻塞&#xff0c;直到数据被成功读取或写入。这个模型是最基础的模型&#xff0c;适用于连接较少的应用场景。每个连接都会阻塞主线程&#xff0c;直到完成相应的 I/…

Linux中的几个基本指令(二)

文章目录 1、cp指令例一&#xff1a;例二&#xff1a;例三&#xff1a;例四&#xff1a;例五&#xff1a; 2、mv 指令例一&#xff1a;例二&#xff1a; 3、cat指令例一&#xff1a; 4、tac指令5、which指令6、date指令时间戳&#xff1a;7、zip指令 今天我们继续学习Linux下的…