博客系统问题

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.实现中遇到的问题

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

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值