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.mzph.cn/bicheng/9535.shtml

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

相关文章

Web安全:SQL注入漏洞详解,SQL注入常见功能、危害、分类、判断注入点、注入方式

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道S…

FPGA+炬力ARM实现VR视频播放器方案,3D眼镜显示

3D眼镜显示&#xff1a; FPGA炬力ARM方案&#xff0c;单个视频源信号&#xff0c;同时驱动两个LCD屏显示&#xff0c;实现3D 沉浸式播放 客户应用&#xff1a;VR视频播放器 主要功能&#xff1a; 1.支持多种格式视频文件播放 2.支持2D/3D 效果实时切换播放 3.支持TF卡/U盘文…

24数维杯C题18页保姆级思路+代码+后续参考论文

18页保姆级思路&#xff1a; 24数维杯C题20页保姆级思路&#xff0b;可执行代码&#xff0b;参考论文 简单麦麦https://www.jdmm.cc/file/2710641/ 群&#xff1a;666165284 1&#xff09;确定天然气水合物资源分布范围 要确定天然气水合物资源的分布范围&#xff0c;需要分…

谷歌上架,白包号放着备用,啥也没干也被封?是什么情况?

众所周知&#xff0c;Google Play Store是全球最大的应用商店之一&#xff0c;每天都有大量的应用被上传和下架。 同时&#xff0c;随着谷歌上架行业的发展&#xff0c;谷歌现在的审核系统越来越智能和先进&#xff0c;开发者们尝试着各种方法来提高上架成功率。其中&#xff…

go方法集

方法集 Golang方法集 &#xff1a;每个类型都有与之关联的方法集&#xff0c;这会影响到接口实现规则。 • 类型 T 方法集包含全部 receiver T 方法。• 类型 *T 方法集包含全部 receiver T *T 方法。• 如类型 S 包含匿名字段 T&#xff0c;则 S 和 *S 方法集包含 T 方法。 …

提升工作效率的秘密武器

&#x1f31f;工作小能手们&#xff0c;你们是否还在为日复一日的办公琐事感到头疼&#xff1f;别急&#xff0c;今天我就为大家种草几款鲜为人知但超级实用的工作软件&#xff0c;让你的工作效率飞起来&#xff01;&#x1f308; 1️⃣《亿可达》 &#x1f5a5;️ 它是一款自…

Windows系统本地部署DrawDB数据库设计工具并实现无公网IP远程访问

文章目录 1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 开发中很多时候都会使用到数据库&#xff0c;所以选择一个好用的数据库设计工具会让工作效率翻倍。在当今数字化时代&#xff0c;数据库管理是许多企业和个人项目的核心。设…

Day2:调节屏幕驱动

Day2调节屏幕驱动 原理图&#xff1a; 要想调节屏幕驱动

双亲委派模型如何确保类加载的顺序

双亲委派模型确保类加载的顺序主要通过以下步骤&#xff1a; 1、当前类加载器检查&#xff1a; 当一个类加载器&#xff08;我们称之为当前类加载器&#xff09;收到类加载请求时&#xff0c;它首先会检查该类是否已经被自己加载过。如果已经加载过&#xff0c;则直接返回已加…

全球10KM土地利用程度数据

全球10KM土地利用程度数据 数据介绍 “一带一路”监测区域土地利用程度指数平均值为0.34&#xff0c;不同区域利用程度差异明显&#xff0c;但总体上高值区域与人口分布的稠密区域吻合。中南半岛、南亚、欧洲和小亚细亚半岛等地海拔较低&#xff0c;水热组合条件较好&#xff…

服务器直连电脑(盒子直连电脑)电脑需要设置为固定ip才能访问盒子

文章目录 现象盒子设置为固定ip&#xff0c;pc设置成固定ip&#xff08;以太网网卡&#xff0c;realtak那个&#xff0c;不是tap-windows那个&#xff0c;tap-windows不用管&#xff09;&#xff0c;在pc上用ip搜索工具搜索&#xff0c;可以搜到盒子ip。盒子设置为固定ip&#…

ESrally单机向量检索性能测试全流程

ESrally单机向量检索性能测试全流程 测试方案的尝试 准备测试 ES 的向量检索性能,Vespa 方案由于下载依赖库存在网络问题无法执行成功,终止;开源工具 ann-benchamrk 是一个用于评估近似最近邻(ANN)搜索库的性能测试工具,这个本是最佳选择,但是也由于需要 pip 安装几十…

Metes and Bounds Pro for Mac 激活版:精准数据转换与绘图利器

Metes and Bounds Pro for Mac是一款专为土地测量和边界划定而设计的专业软件&#xff0c;为Mac用户提供了高效、精确的测量工具。其核心功能在于其全面的测量工具和简便的操作流程&#xff0c;能够满足在土地管理、房地产开发、农业规划等领域的多样化需求。 这款软件集合了距…

探索绘图神器draw.io:打造高效、灵活的图形设计新体验

探索绘图神器draw.io&#xff1a;打造高效、灵活的图形设计新体验 一、引言 在数字化时代&#xff0c;图形设计已经成为众多行业不可或缺的一部分。然而&#xff0c;对于非专业的图形设计师来说&#xff0c;如何快速、高效地完成图形设计任务&#xff0c;一直是一个挑战。今天…

基于docker安装flink

文章目录 环境准备Flinkdocker-compose方式二进制部署 KafkaMysql Flink 执行 SQL命令进入SQL客户端CLI执行SQL查询表格模式变更日志模式Tableau模式窗口计算 窗口计算滚动窗口demo滑动窗口 踩坑 环境准备 Flink docker-compose方式 version: "3" services:jobman…

媲美Suno、Udio!AI铁了心,要砸音乐人的饭碗

5月10日凌晨&#xff0c;著名语音生成式AI平台ElevenLabs在社交平台宣布&#xff0c;推出文本生成歌曲产品ElevenLabs Music。 从其展示的效果来看&#xff0c;音乐的节奏感、和声、乐器的搭配、情感表达、创意性、风格的多样性、高/低音&#xff0c;可媲美该领域的两款头部产…

c++ 查看线程状态

在C标准库中&#xff0c;std::thread类并没有直接提供查询线程状态的方法。std::thread类提供了创建线程、等待线程结束&#xff08;join()&#xff09;或分离线程&#xff08;detach()&#xff09;的接口&#xff0c;但并没有提供一个函数来检查线程是否仍在运行、是否阻塞、是…

618精选好物推荐,五款品质与性价比并存的选择!

在繁忙的生活中&#xff0c;我们总是渴望找到那些能够提升生活品质的好物&#xff0c;让每一天都过得更加精彩。而618购物节&#xff0c;无疑是寻找这些好物的绝佳时机。在这个盛大的购物狂欢中&#xff0c;我们为大家精选了五款品质与性价比并存的选择&#xff0c;让大家在享受…

『大模型笔记』Google CEO Sundar Pichai(桑达尔·皮查伊)谈人工智能的未来!

Google CEO Sundar Pichai(桑达尔皮查伊)谈人工智能的未来! 文章目录 一. Google CEO谈人工智能的未来总结摘要观点时间线二. 参考文献中文字幕视频链接,欢迎关注我的xhs账号:Google CEO 皮查伊谈人工智能的未来! 一. Google CEO谈人工智能的未来

【C++】n个一位数能够组成的最大数

文章目录 题目题目描述输入输出样例输入样例输出 思路AC代码 题目 题目描述 请问n个一位数能够组成的最大的整数是多少。 比如&#xff0c; n 3 n3 n3&#xff0c;3个整数为 1 、 3 、 9 1、3、9 1、3、9&#xff0c;那么组成的最大整数是 931 931 931。 比如&#xff0c; n…