博客系统问题

1.数据库相关的问题,包括定义表的结构、创建数据库表、增删改查操作的实现:

Flask程序中,使用了ORM(Object Relation Mapping, 对象关系映射)这种思想来定义实体类并据此创建数据库表。
创建:首先是在代码中定义python类,如用户类User, 博客类Blog, 这些类定义的时候继承了Flask_SQLAlchemy里面的db.Model,定义类里面的字段时使用db.Column实例,每个实例代表数据库表里面的一个列。定义好所有的类之后,使用SQLAlchemy提供好的create_all方法来创建数据库和其中的表。
查询:进行查询时,使用上面定义的python对象进行查询,如User.query获取了一个查询对象,这个查询对象还需要使用SQLAlchemy提供的一些方法来添加条件,如过滤filter方法、filter_by方法对查询结果进行排序;排序order_by方法对查询结果进行排序;如分组group_by方法对查询结果进行分组;限制结果数量limit()方法限制查询结果的数量;first()方法获取查询结果的第一个值,all()方法获取查询结果中的所有记录。比如需要查询所有用户信息时,可以使用User.query.all();对查询结果进行排序时,可以使用User.query.order_by()。
修改:进行修改时,首先通过查询获取到需要修改的对象,然后对其中的字段进行修改,修改之后提交。如修改用户名,首先查询得到用户,然后修改:
user = User.query.filter_by(username=‘Alice’).first()
user.username=“Bob”
db.session.commit()
删除:删除数据使用delete命令:
db.session.delete(user)
db.session.commit()
db.session是一个数据库会话对象,能用于程序和数据库之间的交互。db.session.commit是一个操作,用于将当前修改永久保存到数据库中。

2.如何确认用户是否登录、如何确认用户身份、如何控制访问权限,让管理员用户访问后台,普通用户不能访问后台?

用户是否登录系统,可以通过Flask_login提供的@login_required这个装饰器来确认。用这个装饰器来装饰函数,能确保只有用户登录之后才能执行函数,如果没有登录将不会执行。
Flask_login在用户登录之后,会将用户信息存放到session中。用户关闭浏览器再次访问时,只要session中的用户信息还在,Flask能通过session获取用户信息,就可以自动登录。
确认用户身份:Flask_login提供了一个对象current_user可以获取当前登录系统的用户对象。由于用户表里面有一个字段用户角色(role_id),因此可以用这个字段来确认用户的身份。可以定义一个限制访问权限的装饰器,用这个装饰器装饰函数之后,将会保证只有用户角色是管理员时才能执行,否则不执行。
补充:装饰器是什么?它时Python的一个特性,用来修饰函数,不改动原来函数代码的同时,增加函数的功能。装饰器可以自己定义,也可以使用flask及其插件提供的装饰器。具体的执行过程是,首先执行装饰器里面的代码,然后再执行被装饰的函数。

3.用户输入的URL如何映射到相应的页面?前台请求和后台响应之间是如何联系的?

首先,在代码中已经为所有的页面url和对应的视图函数进行了路由映射,这是Flask提供的功能,编写代码时只需要创建这种映射,具体来说就是给视图函数上面加上装饰器@app.route(),括号里面写路由的相对地址,也就是去除前缀localhost:5000.
用户在浏览器中输入URL后,浏览器向服务器发送请求,Flask根据URL查找对应的视图函数并执行,然后给浏览器返回结果。

4.后台数据是如何获取到的?如何连接数据库进行查询?

后台数据是通过查询数据库来得到的。首先在Flask应用中配置好数据库的地址和密码,然后创建SQLAlchemy对象绑定到Flask应用上。由于Flask应用使用ORM对象关系映射定义了模型类,所以可以用模型类进行查询,通过SQLAlchemy提供的query方法进行查询,而不用编写MySQL代码。查询时可以指定条件,如query.filter_by()方法里面可以指定查询条件;还能给查询结果使用过滤器,如.all()返回所有数据;.first()返回第一条数据。

5.获取到的数据如何渲染到前台页面?前台页面是如何生成的?

通过查询数据库得到的数据,要想渲染到页面上,需要使用Flask提供的render_template函数。Render_template函数接收一个模板文件和要渲染的数据。模板文件是预先定义好的HTML文件,中间包括占位符,Flask的模板引擎会把数据填充到占位符中,然后返回填充好的HTML文件,也就是渲染后的页面。

6.模板是如何定义的?

模板文件可以认为是数据的载体,它的样式和布局,可以提前定义好,但是留下一些占位符,用于后续动态数据填充。定义页面的布局只需要用到一些HTML标签和CSS样式。

7.搜索功能是如何实现的

搜索功能的实现用到了Flask_whooshee这个插件。在定义模型类时,只需要在类的前面加上@whooshee.register_model()这个装饰器,装饰器里面的参数是模型中需要被检索的字段。比如在定义博客类Blog时,在前面加上@whooshee.register_model('title', 'content', 'introduce')表示博客类里面的标题、正文内容、简介都会被flask-whooshee这个扩展自动建立索引。当用户在搜索框中输入关键字之后,通过Blog.query.whooshee_search(key_word)这个方法来搜索匹配的内容。key_word是用户输入的关键字。

8.评论功能很有意思,介绍一下是怎么实现的

首先,博客和图片下面都有评论框,这个评论框是一个简单的表单,通过textarea输入框获取用户的评论。用户点击提交评论时,调用一段JavaScript代码,通过ajax向处理评论的页面发送请求,在那里将评论写入数据库中,然后请求成功后当前页面重新加载,从而将新评论刷新显示出来。ajax请求成功之后会自动执行success定义的代码块。

9.博客/图片管理页面中,对博客/图片进行的隐藏、置顶、取消置顶是如何实现的?

这三个功能分别对应三个url,当用户点击这个Url时,系统执行url对应的视图函数,对博客进行处理,如设置是否删除字段、是否置顶字段,设置完成后,视图函数再次跳转回当前页面,进行刷新,从而在页面没有跳转的情况下执行这些操作。为什么采用视图函数而不是用JavaScript代码呢?因为这些操作需要和数据库交互,所以需要使用视图函数里面用python实现的代码,而不是javascript代码。同理,对图片、评论、计划以及时间线的操作也是同样的逻辑。

10.博客归档页面是如何实现的?按照时间分层是如何实现的?

首先从数据库中查询得到所有的博客数据,按照时间排序,然后用一个两层的字典来存储,第一层的键是年份,第二层的键是月份,值是一个当月博客数据的列表。这个字典将会传递给前端模板进行渲染。渲染的时候使用列表,按照时间逐层渲染。

11.工具模块中,这几个功能是怎么实现的

这几个功能都是用户写博客时可能用到的工具,网上都有很多对应的实现。这里是提供了一个页面,把效果比较好的实现方式集成起来,方便用户的使用,本质上是集成了开源的代码。

12.数据可视化模块,这些图表是怎么画出来的

绘制这些图表时用到了一个用JavaScript实现的开源可视化库,首先将echarts导入到项目中,然后按照模板用JavaScript实现想要的图表效果。通过ajax请求数据,从数据库中取出来的数据传递给JavaScript代码就可以得到效果。

13.缓存机制是怎么实现的

使用redis是考虑到提升系统的性能,并且增加毕设的工作量,所以在项目中加入了使用比较广泛的redis.在系统中,对于常用的数据才考虑到写入到redis中,比如用户的注册信息,自动生成的验证码,在需要写数据的地方使用redis.set方法写入数据,在需要获取数据的地方使用redis.get方法。使用的过程参考了网上的案例。

14.邮件功能是怎么实现的?什么情况下需要发送邮件?

邮件功能主要使用了Flask-mail这个扩展。首先对于所有需要发送邮件的场景,都先定义一个函数,接受收件人邮箱、邮件内容等数据。需要发送邮件时,就调用这些函数,具体的发送任务是Flask-mail来完成的。当博客和图片收到评论时,博主会收到提醒邮件;当用户注册时,会收到确认邮件;当用户重置密码时,也会收到邮件。

15.实现中遇到的问题

开发中主要困难是,不断地给系统增加新的功能的过程中遇到一些困难,一方面需要更多的编程工作,需要不断地学习,另一方面是对已经完成的部分的修改,这样造成了项目代码结构的混乱。修改之后系统的代码更加简洁,逻辑也更加清晰。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P8802 [蓝桥杯 2022 国 B] 出差

P8802 [蓝桥杯 2022 国 B] 出差 分析 很明显:单源最短路径 没有负权边 dijkstra 1.存图 2.准备两个数组 dis[]:更新源点到各个点的距离 vis[]:标记是否访问 3.从源点开始,更新源点到与其邻接的点的距离,每次选…

01.基本概念

操作系统 为什么要有操作系统? 计算机时一个十分复杂的系统,又cpu、内存、磁盘、IO设备、网络接口等等复杂的硬件组成,人的精力是有限的,不可能了解所有的硬件接口,但是程序可以。 所以我们在计算机上安装了一层软件&…

从零入门激光SLAM(十三)——LeGo-LOAM源码超详细解析4

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激…

Linux -- 日志

一 日志的重要性 在之前的编程经历中,如果我们的程序运行出现了问题,都是通过 标准输出 或 标准错误 将 错误信息 直接输出到屏幕上,以此来排除程序中的错误。 这在我们以往所写的程序中使用没啥问题,但如果出错的是一个不断在运行…

fb设备驱动框架分析

一、字符设备注册过程: 归根到底,fb设备也是一个字符设备,所以逃不开常规的字符设备驱动框架: Linux内核中编写字符设备驱动通常遵循以下步骤: ①、定义主设备号: 在Linux中,每个字符设备都…

MySQL 通过 systemd 启动时 hang 住了……

mysqld:哥,我起不来了…… 作者:贲绍华,爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编…

如何查看页面对应的Selenium定位参数

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

谷歌外链怎么发?

既要数量也要质量,要保证你的链接广泛分布,在数量上,确实需要你的链接在各种平台上有所展现,这样能提升你网站的知名度和曝光率,但是,光有数量是不够的,如果这些链接的内容不行,那对…

泰迪智能科技企业数据挖掘流程分析及特色服务优势

企业发展会沉淀大量的数据,数据中囊括了企业业务各种维度指标,通过数据挖掘和数据分析 ,让企业业务了解过去、现在和未来将要发生什么,从而更好的调整企业发展方向。泰迪智能科技企业数据挖掘平台是面向企业级用户快速处理数据构建…

2024年湖北省专升本C语言程序设计大题真题解析

2024年湖北省的专升本考试已于4月30日举行,考试中,出现了许多不同的考试题目,我在网上找到一所高校专升本的大题(好像是湖北师范的,后续会有湖北理工的大题真题解析,敬请期待),那么我…

在新页面中跳转到指定 div容器位置

要在打开新的页面时跳转到指定 div,我们需要结合 HTML、JavaScript 和后端技术来实现。以下是两种常见的方法: 使用 URL 参数传递目标 div 信息 HTML (新页面): 在新页面的链接中,添加参数来指示目标 div 的 id,例如:…

致远M3 Session 敏感信息泄露漏洞复现

0x01 产品简介 M3移动办公是致远互联打造的一站式智能工作平台,提供全方位的企业移动业务管理,致力于构建以人为中心的智能化移动应用场景,促进人员工作积极性和创造力,提升企业效率和效能,是为企业量身定制的移动智慧协同平台。 0x02 漏洞概述 致远M3 server多个日志文…

Vue3自定义指令封装-按钮权限控制v-permission、hasPermissions

背景:平常所接触到的系统权限控制,大部分都是菜单、路由级别的控制,但后台管理系统中,很多操作都是与职责和角色挂钩的,同样一个列表,不同人的操作列并不都一样,有些页面存在一些含有重要数据的…

万物生长大会 | 创邻科技再登杭州准独角兽榜单

近日,由民建中央、中国科协指导,民建浙江省委会、中国投资发展促进会联合办的第八届万物生长大会在杭州举办。 在这场创新创业领域一年一度的盛会上,杭州市创业投资协会联合微链共同发布《2024杭州独角兽&准独角兽企业榜单》。榜单显示&…

MathType2024官方版数学公式编辑器功能全面介绍

在数字化学习和科研的浪潮中,数学公式的编辑与展示成为了不可或缺的一部分。MathType,作为一款专业的数学公式编辑器,凭借其强大的功能和便捷的操作,为科研人员、教师、学生等广大用户提供了极大的便利。下面,我们将对…

基于.NET WinForms 数据CURD功能的实现

使用开发工具 VS 2022 C#,数据库MS SQL SERVER 2019 ,基于NET WinForms,实现数据记录的创建(Create)、更新(Update)、读取(Read)和删除(Delete)等功能。主要控件包括:DataGridView,SqlDataApater , DataTab…

字符以及字符串函数

字符以及字符串函数 求字符串长度strlen 长度不受限制的字符串函数strcpystrcatstrcmp 长度受限制的字符串函数strncpystrncatstrncmp 字符串查找strstrstrtok 错误信息报告strerror 字符分类函数字符转换函数tolowertoupper 内存操作函数memcpymemmovememcmpmemset 这篇文章注…

软件开发故事 - 我对 CTO 撒谎并挽救了项目

原文:GrumpyOldDev - 2024.04.18 这是几年前的事情了。还记得在我职业生涯的初期,父亲曾告诉我,做好工作往往意味着要在上司的阻碍下做好需要做的事情。他的意思是,你可以让上司成功并感到快乐;也可以让上司做每一个决…

Linux的编译器

程序编译的过程 程序的编译过程是将源代码转换为可执行文件的一系列步骤。这个过程涉及多个阶段,主要包括预处理、编译、汇编和链接。下面详细介绍每个阶段: 1. 预处理(Preprocessing) 在实际编译之前,源代码文件首…

让云上用户拥有安全感 可信或成云服务器标配安全能力之一!

什么是虚拟主机 虚拟主机就是利用网络空间技术,把一台服务器分成许多的“虚拟”的主机,每一台网络空间都具有独立的域名和IP地址,具有完整的Internet服务器功能。网络空间之间完全独立,在外界看来,每一台网络空间和一台…