Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

安装配置

首先确保已经安装如下程序:

  1. flask:用于构建web应用程序。
  2. flask-sqlalchemy:用于在 Flask 中连接 MySQL 数据库,通过pip install flask-sqlalchemy安装。
  3. pymysql:运行时可能会出现出现 ModuleNotFoundError: No module named ‘MySQLdb’ 错误,通常是由于缺少 MySQL Python 驱动程序导致的。这里我使用的是 PyMySQL 作为 MySQL 的连接器,通过pip install pymysql安装后,在连接数据库时将连接字符串中的 mysql 替换为 mysql+pymysql即可。
配置数据库连接信息,并创建 SQLAlchemy 用户对象

在配置文件模块config.py中,配置 数据库连接信息,并创建 SQLAlchemy 用户对象,这样就可以在其他地方直接引用:

# config.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()  # 创建全局的 SQLAlchemy 实例def create_app():app = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb.init_app(app)  # 在应用工厂函数中初始化 SQLAlchemy 实例return appclass User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(50), unique=True, nullable=False)nickname = db.Column(db.String(50), nullable=False)password = db.Column(db.String(50), nullable=False)

注意,在app.config[‘SQLALCHEMY_DATABASE_URI’] = 'mysql+pymysql://username:password@localhost/db_name’中要将对应的数据库用户名、密码、地址、表名换成自己数据的真实信息。

编写 routers.py 路由模块

在 routers.py 文件中,编写用户列表、新增用户、删除用户接口

# routers.py
from flask import Blueprint, render_template,request,redirect,url_for,jsonify
from config import db,User  # 导入应用工厂函数中初始化的 SQLAlchemy 实例bp = Blueprint('main', __name__)@bp.route('/')
def index():# 打开数据库连接db.create_all()# 查询所有用户users = User.query.all()# 关闭数据库连接db.session.close()return render_template('users.html',users=users)@bp.route('/add',methods=['GET'])
def add():return render_template('addUser.html')@bp.route('/add_user', methods=['POST'])
def add_user():# 打开数据库连接db.create_all()# 获取请求数据data = request.get_json()username = data.get('username')nickname = data.get('nickname')password = data.get('password')# 创建新用户new_user = User(username=username, nickname=nickname, password=password)print(new_user)db.session.add(new_user)db.session.commit()# 关闭数据库连接db.session.close()return 'User added successfully'# return redirect(url_for('main.index'))@bp.route('/del_user', methods=['POST'])
def del_user():# 打开数据库连接db.create_all()# 获取请求数据data = request.get_json()username = data.get('username')user = User.query.filter_by(username={username}).first()print(user)if user:# 删除用户db.session.delete(user)db.session.commit()# 关闭数据库连接db.session.close()return 'User added successfully'# return redirect(url_for('main.index')) 在else:return 'User not found'def init_routes(app):app.register_blueprint(bp)

这里我使用了 Blueprint 编写路由,便于后期项目管理,也可以不使用。注意,在 Blueprint 中要实现路由跳转,需要写return redirect(url_for('main.index')),如果写成return redirect(url_for('index'))将无法跳转。

用户列表 html 页面

用户列表页面:users.html代码如下

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>用户列表</title>
</head>
<body><h2>用户列表</h2><ul>{% for user in users %}<li>{{user.username}}-{{user.nickname}} <button onclick="delUser('{{user.username}}')">删除用户</button></li>{% endfor %}</ul><a href="http://localhost:5000/add">新增用户</a><script>function delUser(username) {fetch('/del_user', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ username: username })}).then(response => {console.log(response);if (response.ok) {// 请求成功,重定向到首页,从而刷新页面window.location.href = '/';} else {alert('删除用户失败');}})}</script></body>
</html>
新增用户 html 页面

新增用户页面:addUser.html代码如下

<html lang="en"><head><meta charset="UTF-8"><title>Login</title>
</head>
<body><form><h2>新增用户</h2><table><tr><td>Username</td><td><input type="text" name="username" id="username"></td></tr><tr><td>Nickname</td><td><input type="text" name="nickname" id="nickname"></td></tr><tr><td>Password</td><td><input type="password" name="password" id="password"></td></tr><tr><td><button onclick="addUser()">提交</button></td></tr><tr><td><a href="http://localhost:5000/">查看用户列表</a></td></tr></table></form><script>function addUser() {var username = document.getElementById('username').value;var nickname = document.getElementById('nickname').value;var password = document.getElementById('password').value;var data = {username: username,nickname: nickname,password: password};if (username && nickname && password) {fetch('/add_user', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(data)}).then(response => {if (response.ok) {alert('新增用户成功');// 请求成功,重定向到首页,从而刷新页面,视需求而定// window.location.href = '/';} else {alert('新增用户失败');}})} else {alert('请输入表单信息');}}</script>
</body>
</html>
编写 main.py 主程序

最后,在主程序 main.py 中,引入对应模块,并注入app中

# main.py
from config import create_app, db
from routes import init_routes# 调用应用工厂函数创建应用实例
app = create_app()init_routes(app)if __name__ == '__main__':app.run(debug=True)
运行,预览效果

运行 main.py 文件,可以看到

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/685493.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无需公网IP、无需云服务器,异地组网实现远程直连NAS、游戏联机

手机图片、视频太多&#xff0c;存储空间不够用怎么办?出门在外无法直连家中NAS&#xff0c;远程访问NAS速度慢&#xff1f;自建私有云、多媒体服务器&#xff0c;如何多人远程共享媒体资源&#xff1f;幻兽帕鲁、我的世界、泰拉瑞亚…局域网游戏&#xff0c;想远程多人联机&a…

The Sandbox 与 Cuisinia 合作推出全新体验!

与 Cuisinia 一起吃 Voxel&#xff01; 召唤所有美食家和游戏玩家&#xff01;准备好在 Cuisinia x The Sandbox Moodie 挑战赛中挑逗你的味蕾&#xff0c;考验你的技能&#xff01;加入我们的美味探险&#xff0c;品尝充满活力的泰国美食。 为什么选择 Cuisinia&#xff1f; …

百融云创回购计划加速落实 机构看好中长期吸引力

单日回购近400万港元B类股份&#xff0c;一站式服务的AI科技领航者百融云创&#xff08;百融云-W,6608.HK&#xff09;的回购计划正在加速落实。 此前&#xff0c;在百融云创2023年年度业绩公告的同时&#xff0c;该公司一并披露将在2024年不时在公开市场购回总金额不超过2.5亿…

知识蒸馏,需要合适的教师模型,学生模型,蒸馏数据,损失函数,训练策略,让小模型有大模型的知识

知识蒸馏使用的是Teacher—Student模型&#xff0c;其中teacher是“知识”的输出者&#xff0c;student是“知识”的接受者。知识蒸馏的过程分为2个阶段: 原始模型训练: 训练"Teacher模型", 它的特点是模型相对复杂&#xff0c;也可以由多个分别训练的模型集成而成。…

3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文阅读

如此热门的项目&#xff0c;网络上有很多大牛分析了这篇文章的做法&#xff0c;在这里简单记录一下个人粗浅的理解。 关于各种数学表达式的推导&#xff0c;论文和参考资料中都提供了较为详细的解读&#xff0c;本人能力有限&#xff0c;这一部分理解不够深刻&#xff0c;先不做…

分布式光伏管理平台功能介绍

一、项目管理系统 1、关键信息&#xff1a;板块化展现项目关键信息&#xff0c;包含所在区域、屋面类型、未来25年发电量、累计收益等信息。 (1) 可迅速获取项目核心要点 (2) 及时跟进修改&#xff0c;凸显项目信息 (3) 项目信息清晰展现&#xff0c;了解整体项目流程 2、项…

音视频开发4 FFmpeg windows 环境搭建,QT 安装,动态库的搜索路径

FFmpeg 为了让所有平台的开发者都能够学习到音视频开发的通用技术&#xff0c;本教程主要讲解跨平台的音视频开发库FFmpeg。其实只要你掌握了FFmpeg&#xff0c;也可以很快上手其他音视频开发库&#xff0c;因为底层原理都是一样的&#xff0c;你最终操作的都是一样的数据&…

【问题分析】锁屏界面调起google语音助手后壁纸不可见【Android 14】

1 问题描述 为系统和锁屏分别设置两张不同的壁纸&#xff0c;然后在锁屏界面长按Power调起google语音助手后&#xff0c;有时候会出现壁纸不可见的情况&#xff0c;如以下截图所示&#xff1a; 有的时候又是正常的&#xff0c;但显示的也是系统壁纸&#xff0c;并非是锁屏壁纸…

【gin框架入门】

1.介绍 Gin 是一个用 Golang编写的 高性能的web 框架, 由于http路由的优化&#xff0c;速度提高了近 40 倍。 Gin的特点就是封装优雅、API友好。 Gin的一些特性&#xff1a; 快速 基于 Radix 树的路由&#xff0c;小内存占用。没有反射。可预测的 API 性能。 支持中间件 传入…

聊聊测试团队管理

管理测试团队是一个复杂但至关重要的任务&#xff0c;它不仅关乎于保证软件产品的质量&#xff0c;还涉及到团队建设、流程优化、技能提升等多个方面。以下是一些关键策略&#xff0c;可以帮助您有效地管理测试团队&#xff0c;比如“持续培训和技术支持&#xff0c;明确目标&a…

AIGC 时代软件工程师:前景、需求与大模型提效探究

过去&#xff0c;在互联网浪潮汹涌的十年来&#xff0c;软件工程师的角色愈发凸显其不可或缺的价值。随着AIGC&#xff08;人工智能生成内容&#xff09;时代的到来&#xff0c;软件开发的每个环节都正在经历一场前所未有的革新。今天&#xff0c;我们深入研究了大型AI模型如何…

相交链表(给你两个链表,找出它们的第一个公共结点)的实现与讲解

一&#xff1a;题目 二&#xff1a;思路讲解 1&#xff1a;应该是先判断是否相交。 2&#xff1a;相交就计算出相交前的两条链表的长度差距 3&#xff1a;让长的那一条链表先走长度的差距&#xff0c;这样会距离交点的距离相等&#xff0c;然后再对两条链表的节点对应着去比…