博客系统问题

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.mzph.cn/web/9652.shtml

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

相关文章

React面试经验2

1.执行顺序题 onClick () > {//athis.setState({num: this.state.num 1,})console.log(1:,this.state.num);//bthis.setState({num: this.state.num 1,})console.log(2:,this.state.num);setTimeout(() > {//cthis.setState({num: this.state.num 1,});console.log(…

将矩阵按对角线排序(Lc1329)——排序

矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat 有 6 行 3 列,从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。 给你一个 m * n 的整…

DevEco:智能、灵活、实时的集成开发环境

引言 前端性能是一个老生常谈的话题了,它不单单是一个技术概念,而是用户体验中非常重要的一环。通常在一些面向用户的产品中它直接影响了用户转化率、粘性等重要指标。 那么是不是不在乎转化率的中后台产品就可以不在乎性能了?显然不是&…

API接口开发实现一键智能化自动抓取电商平台商品评论数据支持高并发免费接入示例

为了实现一键智能化自动抓取电商平台商品评论数据可支持高并发免费接入,你可以使用Python编程语言和相关库(如requests、BeautifulSoup等)来开发一个API接口,也可以使用封装好的api接口获取,注册一个api账号获取key和s…

超详细的胎教级Stable Diffusion使用教程(一)

这套课程分为五节课,会系统性的介绍sd的全部功能和实操案例,让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion,它究竟有多强大? 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

星途重启:244亿公里外的「旅行者1号」,修好了

2024年4月20日,旅行者1号工程团队时隔5个月,终于重新收到了来自47年前所发射的探测器传回的有效数据。 ▲收到数据当天,工程团队成员在NASA喷气动力实验室的会议室中欢呼。 01.关于旅行者1号 在当下5G和WIFI已经普及的时代,NASA喷…

【QT教程】QT6硬件数据库编程 QT硬件数据库

QT6硬件数据库编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免…

Oracle中blob和clob的区别和例子

在Oracle数据库中,BLOB(Binary Large Object)和CLOB(Character Large Object)是用于存储大量数据的两种大型对象(LOB)类型,但它们之间存在一些关键的区别。 数据存储方式&#xff1…

FFmpeg常用API与示例学习(二)

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳,将编码后的数据存储于此封装格式的文件之内。 封装又称容器,容器的称法更为形象,所谓容器,就是存放内容的器具,饮料是内容&…

vue3速览

在您的Vue.js 3应用中,createApp 是用于创建一个Vue应用实例的函数。您已经正确地引入了它并开始创建应用,但目前根组件内部是空的。下面我将为您展示一个更完整的例子,说明如何设置根组件的模板、数据、方法等选项,并挂载到DOM上…

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7)

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力&a…

Python | Leetcode Python题解之第71题简化路径

题目: 题解: class Solution:def simplifyPath(self, path: str) -> str:names path.split("/")stack list()for name in names:if name "..":if stack:stack.pop()elif name and name ! ".":stack.append(name)re…

W801学习笔记二十四:NES模拟器游戏

之前已经实现了NES模拟器玩游戏。W801学习笔记九:HLK-W801制作学习机/NES游戏机(模拟器) 现在要在新版本掌机中移植过来。 1、把NES文件都拷贝到SD卡中。 这回不会受内存大小限制了。我这里拷贝了4个,还可以拷贝更多。 2、应用初始化中,加载…

React 学习-7-组件API

设置状态:setState setState(object nextState[, function callback]) nextState,将要设置的新状态,该状态会和当前的state合并 callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。 替…

FFmpeg常用API与示例学习(一)

工具层 1.av_log 可以设置日志的级别,这个看看名字就明白了,也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…

如何使用 await-to-js 库优雅的处理 async await 错误

通过阅读优秀的源码并从中学习如何写出让人觉得赏心悦目的代码最后再写文章进行总结对整个学习的过程进行一个梳理同时分享给其他人。 JS 异步编程进化之路 回调地狱阶段 在正式介绍 await-to-js 这个库之前,让我们先简单的回顾一下有关于在 JavaScript 这门语言…

ctfshow web入门 php反序列化 web275--web278(无web276)

web275 这道题和序列化一点关系都没有 整个代码并没有说filename(f)怎么传参只有fn并且屏蔽了flag highlight_file(__FILE__);class filter{public $filename;public $filecontent;public $evilfilefalse;public function __construct($f,$fn){$this->filename$f;$this-&g…

bash: docker-compose: 未找到命令

bash: docker-compose: 未找到命令 在一台新的服务器上使用 docker-compose 命令时,报错说 docker-compose 命令找不到,在网上试了一些安装方法,良莠不齐,所以在这块整理一下,如何正确快速的安装 docker-compose cd…

STM32入门周边知识(为什么要装MDK,启动文件是什么,为什么要配置时钟等等)

目录 MDKMDK与C51共存为什么要安装MDK 启动文件是什么,为什么要添加许多文件为什么要添加头文件路径为什么是寄存器配置魔术棒中的define为什么必须先配置时钟杂例 MDK MDK与C51共存 在最开始学习51单片机的时候,当时安装keil的时候,认为就是…

Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录 WebSocket的特点1、工作原理2、特点3、WebSocket 协议介绍4、安全性 WebSocket的使用一、服务端1、创建实例:创建一个webScoket实例对象1.1、WebSocket.Server(options[,callback])方法中options对象所支持的参数1.2、同样也有一个加密的 wss:/…