WEB开发: 全栈工程师起步 - Python Flask +SQLite的管理系统实现
一、前言
罗马不是一天建成的。
每个全栈工程师都是从HELLO WORLD 起步的。
之前我们分别用NODE.JS 、ASP.NET Core 这两个框架实现过基于WebServer的全栈工程师入门教程。
今天我们用更简单的来实现: Python。
我们将用Python来实现一个学生管理应用,它包括Web服务器+管理前端+后端Api+数据库,并满足一个管理应用所具有的基本的增删查功能。由此来熟悉Phthon的webServer (Flask )应用。
二、流程和技术栈
先来看下我们设想的应用流程
然后根据这个来设定一下我们的技术栈:
-
前端:HTML + JS + CSS
前端开发利用HTML来构建网页的骨架和内容结构,CSS用于定义网页的样式和布局,如字体、颜色、空间等,确保网页在不同设备上的视觉效果一致。JavaScript则负责网页的动态交互功能,如响应用户输入、动画效果和与服务器的通信,使得网页变得互动性强,提升用户体验。 -
服务器:Python Flask
Flask是一个轻量级的Python Web框架,适合构建小型到中型的Web应用。它简洁、易于上手,并且高度可扩展。Flask允许开发者定义路由、处理HTTP请求、与数据库交互,并能够快速搭建RESTful API服务,广泛用于开发Web服务和微服务。Flask的灵活性使得开发者可以根据需求选择需要的功能和扩展。 -
数据库:SQLite
SQLite是一种轻量级的嵌入式关系型数据库管理系统,适用于桌面和移动设备应用。它将数据存储在一个单一的文件中,不需要独立的数据库服务器,安装和配置非常简单。SQLite支持SQL标准,可以高效地存储、查询、更新数据,适合用在低并发、数据量较小的项目中,常用于原型开发、小型应用和嵌入式系统。
三、文件结构
所以 首先你需要在自己的电脑上安装PYTHON。默认都有了。
然后需要 pip install sqlite3。 安装这个数据库引擎。
一切齐全,准备动手,动手前先确定一下这个项目的目录文件结构:
目录结构
/student-grade-management├── app.py # Flask应用的主程序├── students.db # SQLite数据库文件├── /templates # 存放HTML模板文件的文件夹| └── index.html # 主页面的HTML文件├── /static # 存放静态资源(如CSS, JS, 图片等)的文件夹├── style.css # 样式文件(CSS)└── script.js # 前端脚本(JavaScript)
这个目录结构是一个典型的 Flask 项目的结构,适用于一个简单的学生成绩管理系统。下面我将逐一解释每个文件和文件夹的作用:
详细解释
1. app.py
- 作用:这是你的 Flask Web 应用的主程序。Flask 是一个轻量级的 Python Web 框架,用于快速开发 Web 应用。
- 功能:在这个文件中,我们会定义所有的路由(URLs)、视图函数(处理请求的函数)和一些与数据库交互的代码。
- 例如:
/
路由显示学生成绩列表。/add
路由处理添加学生成绩。/delete/<id>
路由处理删除学生成绩。/search
路由处理按姓名查询学生成绩。
- 该文件还负责启动 Flask Web 服务器(通常使用
app.run()
)。
- 例如:
2. students.db
- 作用:这是 SQLite 数据库文件,存储系统中的所有数据。
- 功能:SQLite 是一个轻量级的数据库,它会将数据保存在本地文件中。这个数据库文件包含一个表(比如
students
),存储学生的姓名和成绩。- 该数据库可以使用 Python 的
sqlite3
库进行操作。 - 例如,系统会在此数据库中进行以下操作:
- 插入新学生成绩。
- 查询学生成绩。
- 删除学生成绩。
请注意这个db文件最开始需要用脚本生成,脚本中设定了各个字段、表名,见后i面的文件介绍。
- 该数据库可以使用 Python 的
3. /templates
-
作用:这个文件夹存放 Flask 应用的 HTML 模板文件,Flask 会使用 Jinja2 模板引擎来渲染这些 HTML 文件。
-
功能:
- Flask 会使用模板文件来动态生成页面内容。
- 在我们的项目中,
index.html
作为主页面模板,显示学生成绩列表,并提供添加、删除和查询功能。 - Jinja2 语法使得我们可以在 HTML 中插入 Python 变量、执行条件语句、循环等操作。
- 例如,学生的姓名和成绩列表会从数据库中获取,Flask 会将这些数据传递到模板中,然后通过模板渲染显示在页面上。
例如:
<table><thead><tr><th>姓名</th><th>成绩</th></tr></thead><tbody>{% for student in students %}<tr><td>{{ student.name }}</td><td>{{ student.grade }}</td></tr>{% endfor %}</tbody> </table>
4. /static
-
作用:
static
文件夹用来存放 Web 应用中不会变化的静态资源文件,如 CSS、JavaScript、图片等。 -
功能:这些静态文件是客户端直接访问的文件,不需要通过 Flask 后端处理。Flask 会自动处理
static
文件夹中的文件并提供服务。style.css
:存放样式表文件(CSS),用于控制页面的外观和布局。你可以在index.html
中引用它,定义页面的字体、颜色、布局等样式。script.js
:存放 JavaScript 文件,用于处理客户端的交互逻辑。例如,处理添加、删除、查询学生成绩的事件,或者发送 AJAX 请求来与 Flask 后端进行交互。
例如:
<link rel="stylesheet" href="/static/style.css"> <script src="/static/script.js"></script>
典型流程
- 用户在浏览器中访问 Flask 应用时,Flask 会根据请求路由选择适当的视图函数。
- 视图函数可以与数据库交互,获取或修改数据。
- 数据传递到模板中,模板使用 Jinja2 引擎动态生成 HTML 页面并返回给浏览器。
- 浏览器根据返回的 HTML 内容渲染页面,并加载
static
文件夹中的 CSS 和 JavaScript 资源。
四、源码
以下是各个部分的源码:
dbMake.py (这个是一个脚本,用来生成数据库,运行这个脚本可以在根目录下生成一个数据库文件 students.db)
import sqlite3# 连接数据库(如果数据库文件不存在,会自动创建)
conn = sqlite3.connect('students.db')# 创建一个cursor对象
cursor = conn.cursor()# 创建学生成绩表
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,grade INTEGER NOT NULL
)
''')# 提交并关闭
conn.commit()
conn.close()
app.py
from flask import Flask, render_template, request, jsonify
import sqlite3app = Flask(__name__)# 获取数据库连接
def get_db_connection():conn = sqlite3.connect('students.db')conn.row_factory = sqlite3.Row # 返回字典类型的行return conn# 首页,显示学生成绩列表
@app.route('/')
def index():conn = get_db_connection()students = conn.execute('SELECT * FROM students').fetchall()conn.close()return render_template('index.html', students=students)# 添加学生成绩
@app.route('/add', methods=['POST'])
def add_student():name = request.form['name']grade = request.form['grade']conn = get_db_connection()conn.execute('INSERT INTO students (name, grade) VALUES (?, ?)', (name, grade))conn.commit()conn.close()return jsonify({"status": "success"})# 查询学生成绩
@app.route('/search', methods=['GET'])
def search_student():name = request.args.get('name', '')conn = get_db_connection()students = conn.execute('SELECT * FROM students WHERE name LIKE ?', ('%' + name + '%',)).fetchall()conn.close()return render_template('index.html', students=students)# 删除学生成绩
@app.route('/delete/<int:id>', methods=['GET'])
def delete_student(id):conn = get_db_connection()conn.execute('DELETE FROM students WHERE id = ?', (id,))conn.commit()conn.close()return jsonify({"status": "success"})if __name__ == '__main__':app.run(debug=True)
script.js
document.getElementById('add-student-form').addEventListener('submit', function (event) {event.preventDefault();const name = document.getElementById('name').value;const grade = document.getElementById('grade').value;fetch('/add', {method: 'POST',body: new URLSearchParams({'name': name,'grade': grade})}).then(response => response.json()).then(data => {if (data.status === 'success') {alert('学生成绩已添加!');window.location.reload(); // 刷新页面}});
});// 删除学生成绩
function deleteStudent(id) {if (confirm('确定要删除这个成绩吗?')) {fetch(`/delete/${id}`).then(response => response.json()).then(data => {if (data.status === 'success') {alert('学生成绩已删除!');window.location.reload(); // 刷新页面}});}
}// 查询学生成绩
document.getElementById('search-form').addEventListener('submit', function (event) {event.preventDefault();const name = document.getElementById('search-name').value;fetch(`/search?name=${name}`).then(response => response.text()).then(data => {document.body.innerHTML = data; // 更新页面内容});
});
style.css
body {font-family: Arial, sans-serif;margin: 20px;background-color: #f9f9f9;
}h1 {text-align: center;
}table {width: 50%;margin: 0 auto;border-collapse: collapse;
}th, td {padding: 10px;text-align: center;
}form {margin-top: 20px;text-align: center;
}input, button {padding: 10px;margin: 5px;
}
index.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 rel="stylesheet" href="/static/style.css">
</head>
<body><h1>学生成绩管理系统</h1><h2>查询学生成绩</h2><form id="search-form"><label for="search-name">姓名: </label><br><input type="text" id="search-name" name="name"><br><br><button type="submit">查询</button></form><h2>学生成绩列表</h2><table border="1"><thead><tr><th>姓名</th><th>成绩</th><th>操作</th></tr></thead><tbody id="students-list">{% for student in students %}<tr><td>{{ student.name }}</td><td>{{ student.grade }}</td><td><button onclick="deleteStudent({{ student.id }})">删除</button></td></tr>{% endfor %}</tbody></table><h2>添加学生成绩</h2><form id="add-student-form"><label for="name">姓名: </label><br><input type="text" id="name" name="name"><br><br><label for="grade">成绩: </label><br><input type="number" id="grade" name="grade"><br><br><button type="submit">添加</button></form><script src="/static/script.js"></script>
</body>
</html>
准备完毕,命令行切入根目录,执行 python app.py 启动应用
显示 服务器启动了 端口是5000 使用 http://127.0.0.1:5000 可以访问这个应用:
万丈高楼平地起,这个还有一些bug,可以自己修复。祝你好运!
相关文章:

WEB开发: 全栈工程师起步 - Python Flask +SQLite的管理系统实现
一、前言 罗马不是一天建成的。 每个全栈工程师都是从HELLO WORLD 起步的。 之前我们分别用NODE.JS 、ASP.NET Core 这两个框架实现过基于WebServer的全栈工程师入门教程。 今天我们用更简单的来实现: Python。 我们将用Python来实现一个学生管理应用࿰…...

云原生周刊:Kubernetes v1.32 正式发布
开源项目推荐 Helmper Helmper 简化了将 Helm Charts导入OCI(开放容器倡议)注册表的过程,并支持可选的漏洞修复功能。它确保您的 Helm Charts不仅安全存储,还能及时应用最新的安全修复。该工具完全兼容 OCI 标准,能够…...

京准电钟:电厂自控NTP时间同步服务器技术方案
京准电钟:电厂自控NTP时间同步服务器技术方案 京准电钟:电厂自控NTP时间同步服务器技术方案 随着计算机和网络通信技术的飞速发展,火电厂热工自动化系统数字化、网络化的时代已经到来。一方面它为控制和信息系统之间的数据交换、分析和应用…...

深入探索Flink的复杂事件处理CEP
深入探索Flink的复杂事件处理CEP 引言 在当今大数据时代,实时数据处理变得愈发关键。Apache Flink作为一款强大的流处理框架,其复杂事件处理(CEP)组件为我们从海量实时数据中提取有价值信息提供了有力支持。本文将详细介绍Flink…...

clickhouse-数据库引擎
1、数据库引擎和表引擎 数据库引擎默认是Ordinary,在这种数据库下面的表可以是任意类型引擎。 生产环境中常用的表引擎是MergeTree系列,也是官方主推的引擎。 MergeTree是基础引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功…...

力扣hot100——哈希
1. 两数之和 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ans;map<int, int> mp;for (int i 0; i < nums.size(); i) {if (mp.count(target - nums[i])) {ans.push_back(mp[target - nums[i]])…...

少样本学习之CAML算法
上下文感知元学习(Context-Aware Meta-Learning, CAML) 概述 在机器学习和深度学习领域,元学习(Meta-Learning)旨在通过学习如何学习,使模型能够在面对新任务时快速适应。传统的元学习方法通常需要在特定…...

C# 中的闭包
文章目录 前言一、闭包的基本概念二、匿名函数中的闭包1、定义和使用匿名函数2、匿名函数捕获外部变量3、闭包的生命周期 三、Lambda 表达式中的闭包1、定义和使用 Lambda 表达式2、Lambda 表达式捕获外部变量3、闭包的作用域 四、闭包的应用场景1、事件处理2、异步编程3、迭代…...

网络编程 03:端口的定义、分类,端口映射,通过 Java 实现了 IP 和端口的信息获取
一、概述 记录时间 [2024-12-19] 前置文章: 网络编程 01:计算机网络概述,网络的作用,网络通信的要素,以及网络通信协议与分层模型 网络编程 02:IP 地址,IP 地址的作用、分类,通过 …...

制作项目之前的分析
对网页的分析可以从多个角度入手,具体包括内容分析、技术分析、用户体验分析。 以下是对网页分析的详细步骤,帮助你从不同维度评估一个网页的效果与质量: 1. 内容分析 内容是网页最核心的部分,确保其符合用户需求是网页设计的首…...
LeetCode 1925 统计平方和三元组的数目
探索平方和三元组:从问题到 Java 代码实现 在数学与编程的交叉领域,常常会遇到一些有趣且富有挑战性的问题。今天,就让我们深入探讨一下 “平方和三元组” 这个有趣的话题,并使用 Java 语言来实现计算满足特定条件的平方和三元组…...

java开发入门学习三-二进制与其他进制
常见的进制 常用的进制有二进制,八进制,十进制,十六进制。而我们最熟悉的是十进制,他们分别是怎么表达的呢? 定义不同的进制,写法不同 二进制(Binary): 使用前缀 0b 或…...

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)
适用软件:C/S系统、Winform桌面应用软件。 运行平台:Windows .NETCore,.NET8 开发工具:Visual Studio 2022,C#语言 数据库:Microsoft SQLServer 2012,Oracle 21c,MySQL8…...

Linux —— 管理进程
一、查看进程 运行态(Running) 定义:处于运行态的进程正在 CPU 上执行指令。在单 CPU 系统中,同一时刻只有一个进程处于运行态;在多 CPU 或多核系统中,可能有多个进程同时处于运行态。示例: 当…...

Diffusino Policy学习note
Diffusion Policy—基于扩散模型的机器人动作生成策略 - 知乎 建议看看,感觉普通实验室复现不了这种工作。复现了也没有太大扩展的意义。 Diffusion Policy 是监督学习吗 Diffusion Policy 通常被视为一种基于监督学习的方法,但它的实际训练过程可能结…...

【Python】*args和**kwargs
【Python】*args和**kwargs 一、*args: 接收不定数量的位置参数示例1:简单的加法计算器示例2:转发参数给另一个函数 二、**kwargs: 接收不定数量的关键字参数示例3:创建用户配置文件示例4:合并多个字典 三、组合使用*args和**kwar…...

使用正则表达式提取PDF文件页数的实现方案
文章目录 背景介绍实现原理代码实现1. 基础函数结构2. 页数提取逻辑3. 使用示例 正则表达式解析优点与局限性优点局限性 错误处理建议性能优化建议最佳实践建议总结参考资源 背景介绍 在Web应用开发中,我们经常需要获取上传PDF文件的页数信息。虽然可以使用pdf.js等第三方库,但…...

Android实现RecyclerView边缘渐变效果
Android实现RecyclerView边缘渐变效果 1.前言: 是指在RecyclerView中实现淡入淡出效果的边缘效果。通过这种效果,可以使RecyclerView的边缘在滚动时逐渐淡出或淡入,以提升用户体验。 2.Recyclerview属性: 2.1、requiresFading…...

springboot443旅游管理系统(论文+源码)_kaic
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统旅游管理系统信息管理难度大,容错率低&#…...

利用git上传项目到GitHub
GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一…...

Rust之抽空学习系列(四)—— 编程通用概念(下)
Rust之抽空学习系列(四)—— 编程通用概念(下) 1、函数 函数用来对功能逻辑进行封装,能够增强复用、提高代码的可读 以下是函数的主要组成部分: 名称参数返回类型函数体 1.1、函数名称 在Rust中&…...

K-Means 聚类:数据挖掘的瑞士军刀
引言 在数据科学领域,聚类算法是一种非常重要的无监督学习方法,它能够帮助我们发现数据中的自然分组或模式。其中,K-Means 聚类算法因其简单高效而成为最常用的聚类算法之一。无论是市场细分、社交网络分析,还是图像分割等领域&a…...

项目练习:若依-前端项目的目录结构介绍
文章目录 一、目录截图二、目录讲解 一、目录截图 二、目录讲解 1、首先,我们可以看到,这个VUE项目,只有一个App.vue,所以,它是一个单页面系统。 这个App.vue是根组件,root组件。 2、public目录 在Vue 3.…...

知网研学 | 知网文献(CAJ+PDF)批量下载
知网文献(CAJPDF)批量下载 一、知网研学安装二、插件及脚本安装三、CAJ批量下载四、脚本下载及PDF批量下载浏览器取消拦截窗口 一、知网研学安装 批量下载知网文件,格式为es6文件,需使用知网研学软件打开,故需先安装该…...

设计模式期末复习
一、设计模式的概念以及分类 二、设计模式的主题和意图 三、面向对象程序设计原则,记住名字,还要理解它的使用场景以及如何用? 四、松耦合、紧耦合、强关联、弱关联、静态复用、动态复用的概念,还有静态委派,动态委…...

CentOS7源码编译安装nginx+php+mysql
1.安装nginx 安装依赖 yum -y install gcc gcc-c wget automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl openssl-devel 创建一个不能登录的nginx运行用户 groupadd www-data useradd -s /sbin/nologin -g www-d…...

linux CentOS系统上卸载docker
一、停止Docker服务 首先,需要停止Docker服务。使用systemctl命令来停止Docker服务: bash复制代码sudo systemctl stop docker二、卸载Docker软件包 接下来,使用CentOS的包管理器yum来卸载Docker软件包。根据安装的Docker版本和组件&#…...

css中相对定位的应用场景
元素位置微调 文本与图标组合微调:在网页设计中,经常会有文本和图标的组合,比如一个带有搜索图标的搜索框。可以使用相对定位来微调图标在搜索框内的位置。例如,有以下HTML结构: <input type"text" class…...

Android 获取屏幕物理尺寸
注:编译 sdk 需要使用 30 因为引入了 WindowMetrics、uild.VERSION_CODES.R 新 sdk 才存在的类和属性 某些场景处理 view ,对 view 显示的位置要求比较精确,通常我们使用context.getResources().getDisplayMetrics().widthPixels 获取到的宽、…...

C缺陷与陷阱 — 8 编译与链接
目录 1 程序的编译过程 2 动态链接的优缺点 2.1 动态链接的优点 2.2 动态链接的缺点 2.3 只使用动态链接 3 函数库链接的5个特殊秘密 4 警惕Interpositioning 5 产生链接器报告文件 1 程序的编译过程 程序的编译过程是将源代码转换成计算机可以执行的机器代码的过程。…...