Flask08——数据库操作-增删改查作者书籍

MySQL与Python实战:从环境搭建到安全CRUD操作 关系型数据库与脚本语言的协同是现代数据工程的基础能力。MySQL作为部署最广的开源RDBMS,凭借其ACID事务、稳定协议和成熟生态,成为Python数据处理的首选后端;而Python通过mysql-connector-python等驱动,以简洁API实现高效连接、参数化查询与事务控制。这种组合在电商订单管理、财务审计追溯、BI报表生成等场景中展现出极强的工程适应性。本文聚焦真实开发流程——涵盖UTF8MB4中文支持、.env密码安全管理、连接池配置、防全表扫描的索引设计、ON DUPLICATE KEY 阅读详情

增加书籍表

下面我们用flask_sqlalchemy提供的建表语句来通过类的形式创建表。

class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True, comment='作者主键ID')
    name = db.Column(db.String(30), nullable=False, comment='作者姓名')

class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True, comment='书籍主键ID')
    title = db.Column(db.String(30), nullable=False, comment='书籍标题')
    author_id = db.Column(db.Integer, db.ForeignKey('author.id'))  # 外键,关联作者表的主键ID
db.ForeignKey:定义此字段为外键,关联author表的主键ID字段。

修改所有作者模板

<!--all_authors.html文件-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>所有作者</title>
</head>
<body>
    {% extends 'base.html' %}
    {% block content %}
        {% for author in authors %}
            <p>{{ author.id }}、{{ author.name }} |
                <a href="{{ url_for('edit_author', author_id=author.id) }}">编辑</a> |
                <a href="{{ url_for('delete_author', author_id=author.id) }}">删除</a> |
                <a href="{{ url_for('add_book', author_id=author.id) }}">添加{{ author.name }}的书籍</a> |
                <a href="{{ url_for('author_books', author_id=author.id) }}">{{ author.name }}的书籍</a> |
            </p>
        {% endfor %}
        {% for message in get_flashed_messages() %}
            <span style="color:red">{{ message }}</span>
        {% endfor %}
    {% endblock content %}
</body>
</html>

添加书籍

# 添加书籍
@app.route('/add_book', methods=['GET', 'POST'])
def add_book():
    author_id = request.args.get('author_id')  # 首页要拿到作者id,因为我们要添加书籍到某个用户下面
    print(author_id)
    if request.method == 'POST':
        title = request.form.get('title')  # 从表单里面接收过来的
        new_book = Book(title=title, author_id=author_id)  # 要传递两个字段的数据
        try:
            db.session.add(new_book)
            db.session.commit()
            flash('添加书籍成功!')
        except Exception as e:
            flash('添加书籍不成功!')
        return redirect(url_for('all_authors'))
    return render_template('add_book.html')
<!--add_book.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加书籍</title>
</head>
<body>
    {% extends 'base.html' %}
    {% block content %}
        <form action="" method="post">
            书籍名称:<input type="text" name="title" value="">
            <input type="submit" value="确认添加">
        </form>
        {% for message in get_flashed_messages() %}
            <span style="color:red">{{ message }}</span>
        {% endfor %}
    {% endblock %}
</body>
</html>

作者书籍方法一


# 作者书籍 方法一
@app.route('/author_books')
def author_books():
    author_id = request.args.get('author_id')
    books = Book.query.filter(Book.author_id == author_id).all()
    # filter当中  表.字段(以哪个字段为条件进行查询)== 传递的值
    print(books)
    return render_template('author_books.html', books=books)
<!--author_books.html文件-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>作者书籍</title>
</head>
<body>
    {% extends 'base.html' %}
    {% block content %}
        <!--对应视图函数方法一-->
        {% for book in books %}
            <p>{{ book.title }}</p>  <!--这里无法获取到作者数据,因为此页面只有书籍数据-->
        {% endfor %}
    {% endblock %}
</body>
</html>

作者书籍方法二

# 作者书籍 方法二
@app.route('/author_books')
def author_books():
    # 先添加 many_books = db.relationship('Book', backref='one_book_author') 到author表
    # many_books是虚拟字段,此虚拟字段相当于一个作者的所有书籍的列表,one_book_author字段相当于给book表使用的虚拟字段,代表了一本书籍的作者。
    author_id = request.args.get('author_id')  # 拿到作者ID
    one_author = Author.query.get(author_id)  # 通过作者ID取到作者对象
    return render_template('author_books2.html', one_author=one_author)
<!--author_books2.html文件-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ one_author.name }}作者书籍</title>
</head>
<body>
    {% extends 'base.html' %}
    {% block content %}
        {% for book in one_author.many_books %}  <!--通过作者对象拿到作者下面所有书籍,并进行遍历-->
            <p>{{ book.id }}、{{ book.title }} |
                <a href="{{ url_for('edit_book', book_id=book.id) }}">编辑{{ one_author.name }}书籍</a> |
                <a href="{{ url_for('delete_book', book_id=book.id) }}">删除{{ one_author.name }}书籍</a> |
            </p>
        {% endfor %}
    {% endblock %}
</body>
</html>

编辑书籍

# 编辑书籍
@app.route('/edit_book', methods=['GET', 'POST'])
def edit_book():
    book_id = request.args.get('book_id')
    one_book = Book.query.get(book_id)  # 通过书籍id获取单个书籍的记录
    if request.method == 'POST':
        title = request.form.get('title')  # 取到传递过来的书籍的标题
        one_book.title = title  # 将传递过来的书籍的标题赋值到现有记录上
        db.session.add(one_book)
        db.session.commit()
        return redirect(url_for('author_books', author_id=one_book.author_id))
        # 跳转到某一个作者的所有书籍下面,因为当前页面没有作者的数据,所以只能从单个书籍里面通过单本书籍的外键拿到作者的id
    return render_template('edit_book.html', one_book=one_book)
<!--edit_book.html文件-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑书籍</title>
</head>
<body>
    {% extends 'base.html' %}
    {% block content %}
        <form action="" method="post">
            书籍名称:<input type="text" name="title" value="{{ one_book.title }}">
            <input type="submit" value="确认修改">
        </form>
    {% endblock content %}
</body>
</html>

删除单本书籍

# 删除单本书籍
@app.route('/delete_book')
def delete_book():
    book_id = request.args.get('book_id')
    one_book = Book.query.get(book_id)
    db.session.delete(one_book)
    db.session.commit()
    return redirect(url_for('author_books', author_id=one_book.author_id))

批量删除多本书籍

<!--修改模板-->
<!--author_books3.html文件-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ one_author.name }}作者书籍</title>
</head>
<body>
    {% extends 'base.html' %}
    {% block content %}
        <form action="{{ url_for('delete_books') }}" method="post">  <!--注意提交的视图函数已经不是默认的了,还有方法-->
            {% for book in one_author.many_books %}  <!--通过作者对象拿到作者下面所有书籍,并进行遍历-->
                <p>
                    <input type="checkbox" name="book_ids" value="{{ book.id }}">  <!--加复选框,name是多个复选框公用的,是一个列表  值就是当前书籍的id-->
                    {{ book.id }}、{{ book.title }} |
                    <a href="{{ url_for('edit_book', book_id=book.id) }}">编辑{{ one_author.name }}书籍</a> |
                    <a href="{{ url_for('delete_book', book_id=book.id) }}">删除{{ one_author.name }}书籍</a> |
                </p>
            {% endfor %}
            <input type="submit" value="批量删除">  <!--提交按钮注意要在form表单中-->
        </form>
    {% endblock %}
</body>
</html>
# 批量删除多本书籍
@app.route('/delete_books', methods=['POST'])
def delete_books():
    book_ids = request.form.getlist('book_ids')  # 接收复选框参数的语法要注意
    one_book = ''
    for book_id in book_ids:  # 遍历出单本书籍的id,再进行逐一删除即可
        print(book_id)
        print(type(book_id))
        one_book = Book.query.get(int(book_id))
        db.session.delete(one_book)
        db.session.commit()
    return redirect(url_for('author_books', author_id=one_book.author_id))  # 注意跳转要放到最下面,不要放到循环当中。
    # 如果放到循环当中,那么就只删除一条就会跳转走了,也就是不会再继续删除了。

修改删除作者

上一讲,当我们只有一张表的时候,删除作者的时候不会有任何问题,可是现在我们有两张表了,而且书籍表有一个字段是外键,指向作者表,那么如果一个作者存在书籍记录在书籍表的话,删除作者的时候就会有问题。当我们没有配置 many_books = db.relationship('Book', backref='one_book_author') 这个关系的话,会提示删除不了。如果配置了的话,此作者可以删除,但是在书籍表中,此作者下面的书籍记录的author_id这个外键会置为null,这样显示是不合适的,会造成数据的错乱。不建议这样做,所以我们就要修改下删除作者的视图函数了,先遍历删除此作者下面的书籍,再删除此作者即可。

# 删除作者(先删除作者的书籍,后删除作者)
@app.route('/delete_author')
def delete_author():
    author_id = request.args.get('author_id')  # 跟编辑一样需要获取当前用户的id
    one_author = Author.query.get(author_id)  # 通过id获取当前记录(对象)
    for book in one_author.many_books:  # 通过many_books拿到此作者所有书籍,遍历删除
        one_book = Book.query.get(book.id)  # 通过单本书籍id获取单本书籍记录
        try:
            db.session.delete(one_book)
            db.session.commit()
            flash('删除书籍成功!')
        except Exception as e:
            flash('删除书籍不成功!')
    try:
        db.session.delete(one_author)  # 删除作者记录(对象)
        db.session.commit()
        flash('删除作者成功!')
    except Exception as e:
        flash('删除作者不成功!')
    return redirect(url_for('all_authors'))  # 删除之后跳转到所有作者页面
RT-Thread网络编程:基于STM32F407的TCP客户端实现(含完整代码解析) 本文详细介绍了在STM32F407平台上,基于RT-Thread操作系统和LWIP协议栈实现工业级可靠TCP客户端的完整过程。内容涵盖底层ETH驱动配置、Socket编程、连接保活与断线重连机制、数据收发协议设计以及资源管理,提供了可应用于实际项目的健壮代码框架与调试技巧。 阅读详情

相关推荐

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 418

图书管理系统值多对多关系的增删改查

1,多对多的关机设计   作者 <---> 书籍   1.1>ORM穿件第三张表     1>自己创建第三张表     2>让ORM帮我们创建第三章表:models.ManytoManyFiled()     3>第三种,待补充(ORM进阶操作) 2,作者 的增删改查   2.1>if判断       {% if 条件 %}...

weixin_30908941的博客 338

Drupal远程代码执行漏洞(CVE-2018-7600)实战复现:从检测到写入WebShell的全过程

本文详细解析了Drupal远程代码执行漏洞(CVE-2018-7600)的实战复现过程,从环境搭建、漏洞检测到WebShell写入的全流程。该高危漏洞影响Drupal 6.x至8.x版本,允许攻击者未经授权执行任意代码。文章提供了多种POC构造方法和高级利用技巧,帮助安全研究人员深入理解漏洞原理并掌握验证技术。

weixin_29322553的博客 276

人工智能 FLASK作者表和书籍表

导包这些因该都会吧,我就不一个个注释了,这次先写出start这个 页面来,剩下的那些 HTML的 原页面可参考上一章的文章,原理都差不 多参考这因该能做出来。 from flask import Flask,request,render_template,url_for,redirect,flash from flask_sqlalchemy import SQLAlchemy app = Fla...

qq997554300的博客 315

System Verilog学习笔记(十九)——覆盖率

覆盖率是用来衡量验证精度和完备性的数据指标。也可以告诉我们在仿真时设计的哪些结构被触发,哪些没被触发。高质量的验证需要满足以下三个条件。

ljy77882333的博客 2144

VMware vSphere运维管理手册

ESXi 7.0 引入了一种系统存储布局,可对大型模块和第三方组件进行灵活的分区管理和支持,同时简化了调试操作。ESXi 7.0 系统存储更改在 ESXi 7.0 之前,分区大小固定不变,除 /scratch 分区和可选 VMFS 数据存储之外,且分区号是静态的,这些限制了分区管理。在 ESXi 7.0 中,分区整合为更少且更大的可扩展分区,具体取决于所使用的引导介质及其容量。ESXi 7.0 系统存储布局包含四个分区:分区适用情况类型系统引导存储引导加载程序和 EFI 模块。FAT16。

Avenjan优快云博客 3625

python+flask计算机毕业设计某图书馆书籍推荐系统的设计与实现(程序+开题+论文)

该系统需集成用户管理、员工管理、书籍信息管理、图书评分、书籍排行、兴趣标签管理等功能模块,通过先进的推荐算法,为用户提供个性化的书籍推荐服务。该系统能够基于用户的阅读历史、兴趣偏好及书籍的评分、排行等信息,实现个性化书籍推荐,从而优化用户的阅读体验,促进知识的有效传播与利用。通过上述研究内容的实施,本研究将构建一个集用户管理、书籍信息管理、评分、排行、兴趣标签及个性化推荐于一体的综合型图书馆书籍推荐系统,为图书馆用户提供更加智能、高效的阅读服务。定义网页的结构和内容,如段落、链接、图片等。

Node.js橙子毕设程序 953

黑猫详解【UFS Unipro】第1篇:Unipro协议框架详解

UniPro规范适用于广泛的设备类型,如应用程序处理器、co-处理器、调制解调器、存储子系统,包括非易失性内存模块、显示器、相机传感器、3D图形和多媒体加速器。它还适用于不同类型的数据流量,如控制消息、批量数据传输和分组流。MIPI UniPro是一个成熟的通用接口,易于实现、可在传统模块化设备架构中灵活使用,适合满足并应对移动和其他行业不断增长的需求。UniPro充当UFS的数据链路层,负责host和device的连接。UniPro不仅定义了数据链路层,它本是也是一个比较完整的协议栈。

黑猫奥利奥的博客 3645

基于flask+vue框架的网上书店系统的设计与实现[开题+论文+程序]-计算机毕设

网上书店系统应运而生,不仅打破了地域限制,实现了24小时不间断服务,还通过丰富的书籍资源、便捷的搜索功能和个性化的推荐系统,极大地提升了读者的购书体验。本项目的研究意义在于,一方面,为书籍爱好者提供一个便捷、全面的购书平台,通过优化用户界面和搜索算法,使用户能够快速找到所需书籍,享受线上购物的乐趣;通过上述功能模块的设计与实施,本项目旨在构建一个功能全面、操作便捷、体验优良的网上书店系统,满足用户多样化的购书需求,同时为书店管理者提供高效的管理工具。定义网页的结构和内容,如段落、链接、图片等。

zhihao503的博客 610

【QNX+Android虚拟化方案】01 - 芯片介绍

【QNX+Android虚拟化方案】01 - 芯片介绍

|~~~热爱生活、努力学习的小伙汁~~~| 2949

停车位检测:基于YOLOv5与UI界面的实现

YOLOv5是YOLO(You Only Look Once)系列中的最新版本,它能够在单次前向传播中同时完成多个目标的定位与分类,因此被广泛应用于实时目标检测任务。与之前的版本相比,YOLOv5在精度和速度上得到了很大的优化,适合嵌入到实际的自动驾驶和智能交通系统中。YOLOv5使用了卷积神经网络(CNN)进行特征提取,并通过回归方法预测边界框、类别及置信度。高效的推理速度:YOLOv5采用了优化的模型结构,能够在保证精度的同时提供较快的推理速度。较高的精度。

YOLO 696

基于flask+vue框架的的银生中学图书管理系统[开题+论文+程序]-计算机毕设

本研究的意义在于,通过设计并实现银生中学图书管理系统,可以显著提升图书管理的效率和准确性,为学生和教师提供更加便捷、个性化的图书服务。通过该系统的实施,旨在实现图书管理的信息化、智能化和自动化,提升图书资源的利用效率和服务水平,为学生和教师创造一个更加便捷、高效的图书借阅环境。其次进一步明确毕业论文的目标与方向、分析论文的选题背景、整理论题主要内容以及该论文要实现的功能创新点,完成开题报告的填写,经指导教师审查修改后,最终落实完成该阶段工作,并将相关电子版材料提交指导教师保存。

zhihao503的博客 895

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2226

python+flask计算机毕业设计银生中学图书管理系统(程序+开题+论文)

本研究围绕银生中学图书管理系统的设计与实现展开,主要内容包括以下几个方面:首先,进行用户需求分析,明确系统应具备的功能模块,包括用户管理、书籍分类、书籍信息管理、书籍借阅与归还等;该系统需具备用户管理、书籍分类、书籍信息管理、书籍借阅与归还等核心功能,旨在通过现代信息技术手段,解决传统图书管理中存在的问题,提升图书管理的效率与服务质量。另一方面,该系统的应用还能促进图书资源的有效利用,通过数据分析,了解师生借阅偏好,为图书采购提供科学依据,进一步优化图书资源配置。可以控制字体、颜色、间距、布局等视觉表现。

qha104的博客 905

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[开题报告]FLASK框架网上书店信息管理系统901n7(源码+论文)

程序界面:源码、数据库获取↓↓↓↓。

宇澄学长-毕设 1070

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Flask02——request请求及传递接收参数

GET和POST 上一讲,我们已经介绍了flask的最小实例,我们已经可以通过浏览器来请求访问视图函数了,细心的同学应该可以发现我们在浏览器中输入的请求地址前面带的有http://,这也是我们在网上浏览各种网站的时候经常见到的。这就是http协议,它告诉浏览器要通过什么协议去服务器请求数据。当然http协议包含很多内容,我们在此只讨论我们眼前需要了解的一些技术点。 首先提到http协议就不得不说一...

lingjiphp的博客 3641

Flask01——最小实例及路由传参

写在最前适合人群:Web开发从黑窗口到浏览器web框架怎么实现网站开发的最小实例刚才发生了什么? 适合人群: 本教程适合于掌握了Python的基础语法,掌握了基本的MySQL语法,了解HTML,CSS,JS等前端技术,了解基本的Web技术原理,了解HTTP协议更好。 Web开发 早起提到web开发,一般指网站开发,当然现在web开发包括的范围更广了,包括电脑端网站,移动端(手机、平板等)网站,Ap...

lingjiphp的博客 1537

Flask04——请求上下文和应用上下文

在flask框架中,引入了上下文的概念,为了能够让大家真实的感受到上下文在flask框架中所起到的作用,所以下面我就用一个具体的需求实例来给大家进行说明,首先在我不使用上下文思路的情况下来解决这一需求,然后再改造成使用了上下文的方式,那么我们就可以更好的来对比前后的不同,从而感受到上下文的作用、原理、以及给我们带来的好处。 在实际的开发中,当用户登录之后,就会把用户登录时候的时间,IP地址这些数据...

lingjiphp的博客 1048

Flask05——请求钩子和异常捕获

文章目录请求钩子请求钩子执行先后顺序before_request的拦截作用统计网站浏览次数记录最后访问网站时间限制指定IP访问异常捕获 我们在写项目的时候往往会有一些全局性的需求,比如在应用启动之初初始化一些数据,建立数据库链接等。对发起的所有请求记录一些数据,对某些请求进行一些拦截。在请求结束的时候自定义响应数据等。 请求钩子 针对这些全局性的需求,flask框架提供了请求钩子,所谓请求钩子就是...

lingjiphp的博客 829

Flask06——Jinja2模板引擎

文章目录为什么要用模板模板的功能如何调用模板和传递变量过滤器自定义过滤器模板中定义宏模板的继承包含模板中访问内置函数和对象flash闪现 为什么要用模板 到目前为止,我们的视图函数返回的一直是简单的字符串,而我们很清楚的知道,我们的flask框架是做web开发的,也就是要做出来漂亮的页面出来,可是我们现在仅仅只返回了几个字符串,好像跟我们所预想的网站相差甚远。我们要怎样做出我们所看到的各种绚丽多彩...

lingjiphp的博客 758

Flask07——数据库操作-增删改查作者

终于到了我们要操作数据库的时候了,接下来的学习将会让你更有成就感,学完了基础的枯燥的语法,现在就到了我们去做一些功能的时候了,我们在网上看到的形形色色的网站从技术上来说其实可以包括两大块:代码实现业务逻辑,数据库保存真实的数据。两者有机的配合才得以形成了我们看到的各种网站。具体数据该怎么展示,这就是代码要做的事情了,这就是我们经常会用到的查询数据。另外,当然还有访问者与网站的交互,可能会添加新数据...

lingjiphp的博客 739

Flask03——cookie和session

@ cot cookie技术的必要性 今天来讲一个在现今web应用中,最最基础和最最重要的技术点,几乎没有他们就无法促成web技术的推广和应用,他们就是cookie和session一对孪生兄弟。先说一下他们诞生的存在的必要性。 我们在浏览网站的时候,访问每一个页面都需要使用“http协议”来实现。而http协议时无状态的协议,就是说http协议没有一个内部的机制来维护两次请求之间的状态保持。也就是...

lingjiphp的博客 473

Flask10——蓝图

截止目前为止,我们所写的所有视图函数都放在一个文件当中,对于我们开发一个非常小的应用的话,还勉强可以接受,但是在我们真正的开发中,我们可能会需要开发前台应用,后台应用,我们也可能需要操作不同的表,那么,为了便于日后的维护,一般我们会根据不同的功能模块,将文件按功能模块,或者按操作的表的不同来拆分我们的文件到不同的文件当中。下面就仿照真实的开发需求,来模拟一下我们需要解决的问题,已经需要怎么解决。 ...

lingjiphp的博客 375

Flask09——数据库迁移

我们在开发软件的时候往往会有这样的情况,数据库里面的表不是一下子全部键好的,往往是随着开发功能的增加,会不断的增加新表,新的字段,而我们之前也讲了清空表的语句drop_all,创建表的语句creat_all,我们好像可以通过这两个语句对表进行更改,添加新的字段,新的表。 但是,大家有没有想过一个问题,我们每次要添加新的字段的时候都要将表数据全部清空,这就意味着我们要删除之前的数据,再重新建立表结构...

lingjiphp的博客 300

电商销售订单数据统计与可视化分析系统的设计与实现(Flask+ECharts+pandas,6169 条订单全流程拆解)

本文拆解电商订单可视化系统的数据闭环设计,强调“数据管道可复算”是毕设核心。通过15项手算对照的聚合口径、四维筛选联动、真浏览器回归验证,确保图表数字可追溯。技术选型聚焦Flask+pandas+ECharts,实现零依赖部署与稳定渲染。从种子数据设计到布局溢出修复,全程以可复现、可验证为准则,破解“图表堆砌”通病,展现数据类毕设应有的严谨性与工程思维。

qq_45896330的博客 822

flask服务端页面预防被爬措施

但我不推荐robots.txt,一是会暴露敏感路径,二是太麻烦,后续多个页面不好逐一添加.如果短时间一直访问,浏览量只会加一。

hhcgchpspk的博客 175
上一篇: Flask01——最小实例及路由传参
下一篇: Flask09——数据库迁移
零寂前端
博客等级 码龄11年 59粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值