【开源】使用Python+Flask+Mysql快速开发一个用户增删改查系统

项目演示

项目本身很简单,增删改查是几乎所有系统的骨架。正所谓万丈高楼平地起,学会了增删改查,航母就指日可待了:),光速入门,直接看演示图:
在这里插入图片描述

项目地址

https://github.com/mudfish/python-flask-user-crud

Flask框架介绍

说白了就是一个Web框架,能够让你快速开发出Python web应用。简单易用,大家直接看官网就行:
https://flask.palletsprojects.com/en/3.0.x/quickstart/

开发步骤

开发工具

懒得折腾Pycharm了,直接Vscode安装pyhon和flask插件即可,也是比较丝滑的。

准备静态文件

主要用了Bootstrap5和Jquery这两个前端框架,一个是UI,一个是js。
都放到static文件夹下面:
在这里插入图片描述

开发入口文件

这个就是flask运行的文件,里面包括了启动入口,端口号和业务逻辑接口。
在这里插入图片描述

from flask import Flask, render_template, request, redirect, url_for, flash
import pymysql.cursors# Connect to the database
connection = pymysql.connect(host='localhost',user='root',password='123456',db='user_test',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)app = Flask(__name__)# 保持数据库连接
def getconnection():connection.ping(reconnect=True)return connection# 首页
@app.route('/')
def index():try:with getconnection().cursor() as cursor:sql = "SELECT * FROM `tb_user`"cols = ['id', 'name', 'age','gender','phone']cursor.execute(sql)result = cursor.fetchall()cursor.close()return render_template("index.html", items=result, cols=cols, success='')except Exception as e:cursor.close()return render_template("index.html", items=[], cols=[], success='Can\'t view index: ' + str(e))# 搜索
@app.route('/search')
def search():keyword = request.args.get('keyword').strip()try:with getconnection().cursor() as cursor:sql = "SELECT * FROM `tb_user` where name like concat('%%',%s,'%%')"cols = ['id', 'name', 'age','gender','phone']cursor.execute(sql,(keyword))result = cursor.fetchall()# print(result)cursor.close()return render_template("index.html", items=result, keyword=keyword, cols=cols, success='')except Exception as e:cursor.close()return render_template("index.html", items=[], cols=[], success='search error: ' + str(e))@app.route('/toAddPage')
def toAddPage():return render_template('add.html')@app.route('/toEditPage/<int:id>')
def toEditPage(id):# print(id)try:with getconnection().cursor() as cursor:sql = "select * from `tb_user` where id=%s"cursor.execute(sql, (id))result = cursor.fetchone()cursor.close()return render_template("edit.html", item=result, success='')except Exception as e:cursor.close()return render_template("edit.html", success='Can\'t edit User: ' + str(e))@app.route('/add', methods=['POST'])
def add():name = request.form['name'].strip()age = request.form['age'].strip()gender = request.form['gender'].strip()phone = request.form['phone'].strip()try:with getconnection().cursor() as cursor:sql = "INSERT INTO `tb_user` (`name`, `age`,`gender`,`phone`) VALUES (%s, %s,%s,%s)"cursor.execute(sql, (name, age,gender,phone))cursor.close()return redirect(url_for("index"))except Exception as e:cursor.close()return render_template("add.html", success='Can\'t add User: ' + str(e))@app.route('/edit',methods=['POST'])
def edit():id = request.form['id'].strip()name = request.form['name'].strip()age = request.form['age'].strip()phone = request.form['phone'].strip()gender = request.form['gender'].strip()try:with getconnection().cursor() as cursor:sql = "update `tb_user` set name=%s,age=%s,gender=%s,phone=%s where id=%s"cursor.execute(sql, (name, age,gender,phone,id))cursor.close()return redirect(url_for("index"))except Exception as e:cursor.close()return render_template("edit.html", success='Can\'t edit User: ' + str(e))@app.route('/remove/<int:id>/')
def remove(id):try:with getconnection().cursor() as cursor:sql = "delete from `tb_user` where id=%s"cursor.execute(sql, (id))cursor.close()return redirect(url_for("index"))except Exception as e:cursor.close()return render_template("index.html", success='Can\'t remove User: ' + str(e))@app.errorhandler(404)
def page_not_found(error):return render_template('page_not_found.html'), 404@app.errorhandler(500)
def system_error(error):return render_template('500.html'), 500if __name__ == '__main__':# 静态文件缓存自动刷新app.jinja_env.auto_reload = Trueapp.run(host='127.0.0.1',port=8001, debug=True)

开发html文件

后端接口有了,接下来就是web端发起调用,完成增删改查交互操作了。
此处flask提供了简单易用的渲染语法,请看:

首页

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link href="{{ url_for('static', filename = 'css/bootstrap.min.css') }}"rel="stylesheet"><title>首页</title></head><body><div class="container"><div class="row justify-content-center align-items-center g-1"><div class="col-6 pt-5"><!-- search --><form action="/search" method="get"><div class="input-group mb-3"><input type="text" class="form-control" placeholderaria-label="Example text with button addon"aria-describedby="button-addon1" name="keyword" {% if keyword%} value="{{keyword}}" {% endif %}><button class="btn btn-primary" type="submit"id="button-addon1">查询</button><a class="btn btn-warning " href="/toAddPage">新增</a></div></form><divclass="table-responsive"><tableclass="table table-primary"><thead><tr><th scope="col">ID</th><th scope="col">姓名</th><th scope="col">性别</th><th scope="col">年龄</th><th scope="col">联系方式</th><th scope="col">操作</th></tr></thead><tbody>{% for item in items %}<tr>{% for col in cols %}<td>{{ item[col] }}</td>{% endfor %}<!-- 补操作列 --><td><a class="btn btn-sm btn-primary"href="{{url_for('toEditPage',id=item['id'])}}">编辑</a><a class="btn btn-sm btn-danger"href="{{url_for('remove',id=item['id'])}}"onclick="return confirm('确定删除吗');" >删除</a></td></tr>{% endfor %}</tbody></table><div class="bg-warning  ">{{success}}</div></div></div></div></div><scriptsrc="{{url_for('static',filename='js/jquery.min.js')}}"></script></body>
</html>

新增页面

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>新增用户</title><link href="{{ url_for('static', filename = 'css/bootstrap.min.css') }}"rel="stylesheet"></head><body><div class="container"><div class="row justify-content-center align-items-center g-1"><div class="col-6 pt-5"><div class="card"><div class="card-header">新增用户</div><div class="card-body"><form action="/add" method="post"><div class="row mb-3"><label for="colFormLabelSm"class="col-sm-2 col-form-label col-form-label">姓名</label><div class="col-sm-10"><input type="text" class="form-control form-control-sm"id="colFormLabelSm" name="name" required></div></div><div class="row mb-3"><label for="age" class="col-sm-2 col-form-label">年龄</label><div class="col-sm-10"><input type="text" class="form-control" id="age" name="age"required></div></div><div class="row mb-3"><label for="inlineRadio1"class="col-sm-2 col-form-label">性别</label><div class="col-3"><input class="form-check-input" type="radio" name="gender"id="gender01" value=""><label class="form-check-label" for="inlineRadio1"></label></div><div class="col-2"><input class="form-check-input" type="radio" name="gender"id="gender02" value=""><label class="form-check-label" for="inlineRadio2"></label></div></div><div class="row mb-3"><label for="phone"class="col-sm-2 col-form-label">联系电话</label><div class="col-sm-10"><input type="text" class="form-control" id="phone"name="phone" required></div></div><divclass="row mb-3 justify-content-center align-items-center "><div class="col-6"><a type="button" class="btn btn-secondary " href="/">取消</a><button type="submit" class="btn btn-primary ">保存</button></div></div></form></div><div class="bg-warning  ">{{success}}</div></div></div></div></div></body>
</html>

编辑页面

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>修改用户</title><link href="{{ url_for('static', filename = 'css/bootstrap.min.css') }}"rel="stylesheet"></head><body><div class="container"><div class="row justify-content-center align-items-center g-1"><div class="col-6 pt-5"><div class="card"><div class="card-header">新增用户</div><div class="card-body"><form action="/edit" method="post">{% if item %}<input type="hidden" name="id" value="{{item.id}}"><div class="row mb-3"><!-- {{item}} --><label for="colFormLabelSm"class="col-sm-2 col-form-label col-form-label">姓名</label><div class="col-sm-10"><input type="text" class="form-control form-control-sm"id="colFormLabelSm" name="name" value="{{item.name}}"required></div></div><div class="row mb-3"><label for="age" class="col-sm-2 col-form-label">年龄</label><div class="col-sm-10"><input type="text" class="form-control" id="age" name="age"value="{{item.age}}" required></div></div><div class="row mb-3"><label for="gender" class="col-sm-2 col-form-label">性别</label><div class="col-3"><input class="form-check-input" type="radio" name="gender"id="gender01" value="男" {% if item.gender=="男" %} checked{% endif %}><label class="form-check-label" for="gender01"></label></div><div class="col-2"><input class="form-check-input" type="radio" name="gender"id="gender02" value="女" {% if item.gender=="女" %} checked{% endif %}><label class="form-check-label" for="gender02"></label></div></div><div class="row mb-3"><label for="phone"class="col-sm-2 col-form-label">联系电话</label><div class="col-sm-10"><input type="text" class="form-control" id="phone"name="phone" value="{{item.phone}}" required></div></div><divclass="row mb-3 justify-content-center align-items-center "><div class="col-6"><a type="button" class="btn btn-secondary  " href="/">取消</a><button type="submit" class="btn btn-primary ">保存</button></div></div>{% endif %}</form></div></div><div class="bg-warning  ">{{success}}</div></div></div></div></body>
</html>

收工

看完觉着有帮助的朋友,一键三连哈~~

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

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

相关文章

设计模式代码实战-责任链模式

1、问题描述 小明所在的公司请假需要在OA系统上发布申请&#xff0c;整个请求流程包括多个处理者&#xff0c;每个处理者负责处理不同范围的请假天数&#xff0c;如果一个处理者不能处理请求&#xff0c;就会将请求传递给下一个处理者&#xff0c;请你实现责任链模式&#xff…

大华相机C#学习之IDevice类

获取方式 Enumerator.GetDeviceByGigeIP() 通过IP地址获取设备对象。 private void test_Click(object sender, EventArgs e) {devicesEnumerator.EnumerateDevices();device Enumerator.GetDeviceByGigeIP("192.168.0.11"); } 常用属性 DeviceInfo 获取设备的信…

uniapp_微信小程序_预约时间组件的使用

一、官方文档 DatetimePicker 选择器 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 (uviewui.com) 二、完成的效果 之前使用的是Calendar 日历 这个太耗性能了&#xff0c;直接页面卡顿&#xff0c;所以就换成以上选择器了 三、代码 <u-datetime-p…

短信登录session-redis

1.流程 1.1 发送验证码 模拟路径 http://127.0.0.1:8080/api/user/code?phone1335566 Request Method:POSTcontroller层 /*** 发送手机验证码*/PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {…

C#自定义窗体更换皮肤的方法:创建特殊窗体

目录 1.窗体更换皮肤 2.实例 &#xff08;1&#xff09;图片资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;Form1.Designer.cs设计 &#xff08;3&#xff09;Form1.cs设计 &#xff08;4&#xff09; 生成效果 &#xff08;5&#xff09;一个遗憾 1.窗…

【银角大王——Django课程Day1】

Django框架第一课 安装Django框架方式一&#xff08;命令行的形式创建Django项目&#xff09;方式二&#xff08;适合企业版的pycharm&#xff09;默认文件介绍app文件介绍快速上手我的导包一直爆红是因为我没使用解释器&#xff0c;没导入包&#xff0c;去设置里面导入包即可—…

在 Node.js 中配置代理 IP 采集文章

不说废话&#xff0c;直接上代码&#xff1a; const http require(http); const https require(https);// 之后可以使用 http 或 https 模块发起请求&#xff0c;它们将自动使用配置的代理 // 代理ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg const proxy …

OpenHarmony实战开发-如何视频弹幕功能。

介绍 本示例介绍如何使用ohos.danmakuflamemaster和ohos.gsyvideoplayer开发支持视频弹幕的播放器。可以自定义弹幕样式、占据屏幕宽度&#xff0c;发送弹幕&#xff0c;开关弹幕视图。 效果图预览 使用说明 点击播放按钮&#xff0c;进行视频播放&#xff0c;弹幕自动开启点…

【位运算】Leetcode 只出现一次的数字 ||

题目解析 137. 只出现一次的数字 II 算法讲解 nums中要么一个数字出现三次&#xff0c;一个数字出现一次&#xff0c;按照比特位来说只可能出现上面的四种情况&#xff1a; 3n个0 0 或者 3n个0 1 或者 3n个1 0 或者 3n个1 1&#xff0c;它们相加的结果依次是0&#xff0c;…

websocket 连接,http 协议下用 ws, https 协议下必须要使用 wss

解决方案&#xff1a; https 相当于使用 httpssl 认证&#xff0c;使用 https 时 websocket 访问&#xff08;比如建立链接时&#xff09;必须要使用 wss。 详细解释&#xff1a; WebSocket 协议有两个主要版本&#xff1a;“ws”和“wss”。"ws"表示非加密的 Web…

【机器学习300问】77、什么是梯度消失和梯度爆炸?

一、梯度消失&#xff08;Vanishing gradients&#xff09; &#xff08;1&#xff09;定义 在训练深度神经网络时&#xff0c;随着误差梯度从输出层向输入层逐层回传&#xff0c;梯度可能因为连乘效应逐渐减小。当使用激活函数的导数的最大值小于1时&#xff0c;深度网络中越…

动静态库详解

文章目录 动静态库动态库静态库动静态链接 动静态库 库LinuxWindows动态库.so.dll静态库.a.lib 动静态库的本质就是文件。lld ldd命令可以查看一个可执行程序所依赖的库文件 ldd code&#xff1a;查看code依赖的库文件 平台要支持开发&#xff0c;必须要提前在系统中安装&am…

flutter书架形式格口的动态创建(行、列数,是否全选的配置)

根据传入的行列数创建不同格口数量的书架 左图&#xff1a;5行3列、右图&#xff1a;3行3列 代码 import package:jade/bean/experienceStation/ExpCellSpecsBean.dart; import package:jade/configs/PathConfig.dart; import package:jade/utils/DialogUtils.dart; import p…

基于SpringBoot+Vue的外卖点餐网站 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;12张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue html 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&…

Java 笔试强训篇- Day1

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 点击消除 1.1 解题思路一 1.2 解题思路二 2.0 在两个数组中找出相同的数 2.1 解题思路 笔试强训说明&#xff1a;有一些题目提供不了原题。 1.0 点击消除 该题链…

Group Query Attention (GQA) 机制详解以及手动实现计算

Group Query Attention (GQA) 机制详解 1. GQA的定义 Grouped-Query Attention (GQA) 是对 Multi-Head Attention (MHA) 和 Multi-Query Attention (MQA) 的扩展。通过提供计算效率和模型表达能力之间的灵活权衡&#xff0c;实现了查询头的分组。GQA将查询头分成了G个组&#…

事务的传播行为介绍和事务失效

常用的就下图介绍的这两种&#xff0c;REQUIRED 支持当前事务&#xff0c;如果不存在&#xff0c;就新建一个&#xff0c;EQUIRES_NEW 如果有事务存在&#xff0c;挂起当前事务&#xff0c;创建一个新的事务 同一个service中必须用代理对象调用&#xff0c;否则失效

使用go和消息队列优化投票功能

文章目录 1、优化方案与主要实现代码1.1、原系统的技术架构1.2、新系统的技术架构1.3、查看和投票接口实现1.4、数据入库MySQL协程实现1.5、路由配置1.6、启动程序入口实现 2、压测结果2.1、设置Jmeter线程组2.2、Jmeter聚合报告结果&#xff0c;支持11240/秒吞吐量2.3、Jmeter…

【情侣博客网站】

效果图 PC端 建塔教程 第一步&#xff1a;下载网站源码&#xff08;在文章下方有下载链接&#xff09; 第二步&#xff1a;上传到服务器或虚拟主机&#xff0c;解压。 第三步&#xff1a;这一步很关键&#xff0c;数据库进行连接&#xff0c;看图 admin/connect.php就是这…

el-menu 该有的页面显示不出来第一个应该想到的问题首先就算检查是否多写了一个 , 导致显示不出来原有的页面

问题描述 el-menu 该有的页面显示不出来第一个应该想到的问题首先就算检查是否多写了一个 , 导致显示不出来原有的页面 如图所示多写了一个&#xff0c;就会导致该有的页面显示不出来。