基于python的博客系统的设计与实现(源码+万字报告+部署讲解等)

本文围绕Python实现的博客系统展开。介绍了课题背景与意义,阐述了Python、SQLite和Eclipse等技术。分析了系统功能需求,包括用户认证、角色、资料和博文管理等。进行了系统设计,涵盖认证、用户资料、文章、关注和评论管理。最后说明了测试环境、目的和内容。

第一章 绪论
1.1 课题背景
在博客系统没有被开发使用之前,网民们经常会浏览一些发布论坛的网站,发表文章观点或者通过类似于腾讯QQ中的空间,来表达内心的看法与见解,可是通过使用这些媒介发布的文章都是零散的、杂乱无章的。博客系统的出现,使用者可以把自己身处的境遇而激发的想法或者感受,通过博客系统发布到网站上与大家一起分享。每次编写博文的时候,又会想到一些新奇的想法。虽然某些想法可能没有什么深度,但是没打一个字都是对生活中所遇到事的一种思考与总结,洋洋洒洒的写完一篇博文会得到一种满足感,一种对自己当回作家的满足感。生活中的点滴小事都会使人们迸发奇思妙想,甚至是和亲戚朋友一次的谈天中的想法。监督自己把学到的东西或者是遇到困难的解决方案,亦或是对生活琐事的有感而发,这都是编写博客的目的。督促自己每天做好总结和反思,一天中学到了什么,遇到了什么困难,体会到了什么感受。
很多各界的精英们也踏上了使用博客的道路。譬如记者、明星、企业等都有了自己的博客网站,形成了一种独特的百家争鸣的状态。企业界引入博客系统,为的是分享公司内部的一些学习资料和网络营销策略。教育部门引进博客系统,为的是管理内部的知识仓库和沟通教学方法。又如程序员使用博客系统来介绍自己的系统项目,将项目开源化。不仅可以让其他用户学习新知识,也可以对项目进行改进和扩展。
1.2 课题意义
博客的发展适应了全球范围内知识社会来临的发展脚步。由于我国处于一个组织机构信息化的初级阶段,博客是一种充分发挥个人主导能力和具有积极意义的非正式知识管理工具还具有深度沟通交流的功能,博客系统的意义在于传播我们国家的知识、扩散知识和有效提升组织的学习和创新能。博客系统用户的急剧增长以及系统得到广泛领域的应用,有助于推动中国学习型社会发展脚步。
本系统结合中国现实的情况以及博客互动性的特点进行设计开发,旨在为用户提供一个技术、学习、交流的平台,促进用户之间的沟通;并根据博客共享性的特点,推动用户间的知识交流,使博客系统成为一个知识分享的园地。
此次毕业设计的意义在于运用在学校学到的技术和在学校培养的自学能力进行独立设计一个系统。通过深入社会实践、了解社会结构、完成毕业设计任务并且撰写论文等,着重培养我们的综合分析能力和解决问题的能力和提高独立性、管理组织和提高社交能力。运用在公司学到的知识加以应用,和公司同事加强技术交流,提升技术和社交能力。这也是对自身在学校学到的知识和自身自学能力的检验。本次所用到的技术为python语言,此前并没有在学校学过,是对综合素质与工程实践能力培养效果的全面检验,这也是对自己的一次挑战!当然此项毕业设计还涉及web知识,数据库知识等。并且用现在比较流行的技术来做毕业设计,也是选择了一个明朗的方向。

第二章 系统主要技术简介
2.1 Python简介
Python和Java一样都属于面向对象的语言,不同的是Python是一种直译式计算机程序设计语言,也是功能十分强大的多平台语言,具有近二十年的发展历史,拥有成熟性和稳定性。Python包含了一系列功能完善并且容易理解的标准库,快速轻松的完成比较多见的任务。Python语法具有简捷和清晰的特点,与其它计算机编程语言不同的是,它采用缩进区分语句块。
Python支持采用命令的编程方式、面向对象编程、面向函数式编程、面向切面编程、泛型编程等多种程序设计方式。和很多动态语言如Scheme、Ruby、Perl、Tcl等一样,Python同样拥有垃圾回收的功能,可以自动管理系统的内存使用。它经常被用作脚本语言来处理后台任务和Web编程,然而它也能非常完美的完成多种高阶任务。Python虚拟机基本上可以在所有的操作系统中运行。使用一些工具诸如py2exe、PyPy、PyInstaller可以将Python源代码转换成可以不需要Python解释器就可以执行的程序。
Python特点:

  1. 简单易学:Python上手比较快,因为Python简单并且丰富的说明文档。
  2. 运行速度快:Python 的底层语言是用C 语言,Python中很多标准库还有第三方库也都是运用 C语言 写的,运行速度非常迅速。
  3. 开源性:Python是众多的开放源代码之一。使用Python的程序员可以随意的复制、阅读源代码。
  4. 高层语言:运用Python语言编写程序时不需要考虑一些例如如何管理程序使用内存一类的底层细节。
  5. 可移植性:由于Python开源的特点,Python可以被移植到许多平台上(经过代码的修改使它能在不同平台上工作)。例如pc端的系统Linux、Windows等、还有移动端的Symbian以及Google基于linux开发的android平台。
  6. 解释性:用C语言或C++写的程序可以从源文件(C或C++语言)转换成一个当前计算机所使用的语言(即0和1)。通过这个步骤编译器和不同的标记、选项来完成任务。
    使用计算机内部系统时,Python解释转换源代码转换成称为字节代码的中间代码,然后将其转换成由当前计算机使用,并运行该代码的机器语言。这一过程使得它更容易使用Python 。同时Python程序变得更容易移植。
  7. 面向对象:Python不仅支持面向过程的编程也支持面向对象的编程。在这个过程中取向的语言中,程序由一个过程或只是一个可重复使用的代码功能建立起来。
  8. 可扩展性:如果你想有一个关键的代码运行得更快或者希望某些代码不开放,你可以使用C或C ++写一些程序功能,然后调用他们的Python程序。
  9. 可以嵌入性:开发者可以嵌入Python代码到C / C ++程序,它提供了脚本功能的系统用户使用权限。
  10. 丰富的库:Python标准库很庞大。它可以帮助你处理各种工作,包括正则表达式、 文档生成、单元测试等等。只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以 外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
  11. 规范的代码:Python使用tab键来分割语句使得代码具有良好可读性。并且Python语言写的程序代码不需要编译成二进制代码。
    2.2 SQLite简介
    SQLite,是一个轻型的数据库,遵守ACID的关联式数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。
    不像常见的客户-服务器范例,SQLite引擎不是建立程序来和引擎通信的独立进程,而是一个主要组成部分来连接到程序。所以主要的通信协议直接调用编程语言内的API。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
    特点:
  12. 支持数据库事务
  13. 无需配置:不安装和管理配置也能使用
  14. 信息被存储在单个磁盘文件中,而且整个数据是存储在完整的数据库中。
  15. 数据库文件可以在不同字节顺序的机器间自由共享。
  16. 数据库大小最多支持到2TB大小。
  17. 该数据库包含130万行C代码大约4.43M。
  18. 相对于目前流行的数据库做一般的数据库curd操作要快。
  19. 数据库的操作十分简单,API简单易懂。
  20. 源代码的注解十分详细, 测试覆盖率达到90%以上。
  21. 独立性: 无需依靠其他依赖就可使用。
  22. 代码开源,用户可以将源代码用到任何场所。
  23. 支持多种语言开发程序,例如C语言, C++, Java, Python等主流语言。
    2.3 eclipse简介
    Eclipse是有IBM开发的著名的跨多平台的自由集成开发环境软件(IDE)。最初软件开发用做Java语言开发,现在也可以通过添加插件使其成为其他计算机语言的开发工具例如C++和Python。
    Eclipse的插件机制的建筑风格是轻量级的软件组件。在客户机平台上, Eclipse使用插件添加所有的附加功能,如Java之外的其他编程语言的支持。该插件已经被分离,支持C / C ++ (CDT)、数据库开发等多种用途和语言开发。插件架构可以支持任何延伸到现有的开发环境,例如配置管理,这并不限定于支持各种编程语言。
    一切都是插件是Eclipse的设计思路。 Eclipse的核心并不大,除了java开发,其它所有功能,都把插件添加到Eclipse的核心中。 Eclipse的基本核心包括:图形API (SWT / JFace的) , Java开发环境插件( JDT) ,插件开发环境( PDE )等。

第三章 系统需求与分析
3.1 系统功能需求
3.1.1 用户认证
用户认证模块针对所有用户,用户连接程序进行身份认证,通过认证后,程序知道用户身份,就可以提供针对性的体验。
1.密码的安全性,运用计算密码散列值来实现对密码的保护。
2.使用蓝本实现不同界面的跳转功能。
3.用户登录后,认证状态被Flask-Login记录下来,管理用户认证系统中的认证状态。
4.新用户想成为成为其中的一员,必须在博客系统中注册,根据博客系统的需求,用户分为3个角色:用户、言论管理员、管理员。
1) 用户的主要功能
用户的用例图如图3-1所示。

图3-1 博客系统用户用例图
账号操作:注册账号,设置认证邮箱和密码,并且具有修改自己邮箱账号和密码。
修改个人资料:编辑作者的姓名,位置等信息。
发布博文:用户可以随性所欲的发表自己的想法和理念。
修改博文:用户可以修改自己发布的文章。
关注博主:关注其他用户,在指定一栏中显示关注者的文章。
查看个人资料:点击用户,链接到作者的用户资料界面。
2) 言论管理员的功能
言论管理员的用例图如图3-2所示。

图3-2 博客系统言论管理员用例图
言论管理员拥有普通用户的权限,并且具有言论管理的权限。如果有用户使用了不正当的言论,管理员可以将评论给屏蔽掉。

    3) 管理员的功能

管理员的用例图如图3-3所示。

图3-3 博客系统管理员用例图
管理员拥有言论管理员的权限,还有修改所有用户的用户组和用户资料。
5.用户可以管理自己账号,修改个人资料和邮箱地址和密码。
3.1.2 用户角色
程序对于角色赋予了不同的权限。所有用户的权限总共一下几种操作:关注用户,在他人的博文中发表评论,编写博文,管理别人发表的评论,管理权限。
角色分为4种:
1.匿名游客在系统中只有阅读权限。
2.用户编辑并发表文章、发表自己的言论、关注他人、查看他人信息的权限。
3.言论管理员 审查那些不当的言论的权限。
4.管理员 拥有所有的权限,并且包括修改所有注册用户的角色的权限。
3.1.3 用户资料
网络社交中往往会有提供给用户的资料页面,只要用来了解到作者的个人信息和兴趣爱好。用户可以把自己资料的URL分享给其他人,这样别人能更方便的了解作者。
用户资料中有用户姓名、用户所在位置、关于用户的信息、加入博客系统时间等信息。用户可以编辑自己的资料,但只是编辑一些基本的资料。管理员则在编辑用户时会有编辑用户角色的权限,修改用户的权限资料。在编辑上要创建两个不一样的表单。
用户的头像使用的是其他网站上的图片。使用Gravatar提供的头像。用户只需在网站上绑定自己的邮箱和头像图片,就能使得在博客系统中显示同样的头像。
3.1.4 博文管理
博客系统中允许用户阅读文章,撰写博文。用户不仅可以读取关注的作者博文,还要能自己 发表博文。如果对博文不满意的地方还可以进行修改。对所看的博文有不同意见或者赞同的话也可以评论进行交流。管理员可以直接修改博文,并且可以屏蔽掉不当的言论。
编写博文时,会用到一些标题、引用等特殊格式,所以在编辑博文的时候用到Markdown的语法,简单方便的将文章进行标准化。

3.2 开发环境需求
1、硬件要求
既为终端又为服务器的一台计算机
pc机属性:
CPU:i5 2.0G Hz
内存4G
硬盘:1T
2、软件要求
Windows7 操作系统
SQLite数据库
Eclipse Mars.2 Release开发工具
Python2.7库
Chrome浏览器

第四章 系统设计
4.1系统功能设计
1、认证管理,如图4-1所示。

图4-1 用户认证图
游客访问博客系统时,只能查看一些博文和博主的简单资料,如果要进行深入了解还需注册账户。在注册账户的时候,要求用户提交常用电子邮箱账号和本系统中的用户名及密码。在注册时对邮箱和用户名进行正则校验,不符合条件的无法注册。注册成功后,系统通过SMTP邮箱服务器发送一封确认邮件,收到邮件后单击URL链接后才可以登录博客系统。或者管理员可以在资料中,修改用户的确认状态。
用户还可修改自己的邮箱地址和博客系统密码。修改邮箱时也需进行邮件确认。

2、个人资料管理,如图4-2所示。

图4-2 个人资料管理模块图
用户在注册账户后会提交一些个人资料,这些资料用于博友之间的互相了解。用户登录博客系统后可以对自己的个人资料进行管理。点击主页面的个人资料链接,首先显示的是用户自己的资料。单击编辑资料按钮,将数据库中的数据加载到表单中。编辑用户资料分为两种情况。显而易见,第一种情况用户进入一个页面编辑自己的资料。还有一种是管理员的操作,单击编辑资料可以加载User模型中的字段,例如用户角色。这两个编辑功能有本质上的区别,所以在设计的时候要创建两种不一样的表单来进行资料修改。
用户级别的编辑资料只加载用户的姓名、位置、相关信息3个字段,提交不需要对信息进行校验。而管理员的编辑资料就显得复杂一些,管理员还需编辑用户的电子邮件、用户名、确认状态和角色。邮箱和用户名在提交时要进行正则匹配,如果不符合要求,则不通过验证。

3、博客管理,如图4-3所示。

图4-3 博客文章管理图
用户在使用博客系统时,只要就是享受查看博客和编写博客的乐趣。所以博客管理是比较重要的模块。博文拥有编号、正文、时间戳和作者编号这几个字段。程序首页就有编写博文的表单。如果角色拥有写文章的权限,则会显示编辑博客文章的表单。如果是游客访问的话,写文章的表单不会显示出来。博客文章主页显示的每一条博文都有博主的用户名、头像、发布时间和博客文章。可以点击上面的超链接,访问其他页面。
如果发布的是短消息或者只是更新近期的状态,纯文本格式的就已经足够了。但是如果发布博客文章的话就在格式上被限制住了。所以引入Markdown的语法来给文章添加一些格式。运用pagedown模块,调用JavaScript实现Markdown的转换,能够在表单的下方进行预览。提交时,只提交表单中的Markdown源文本。

4、关注与评论,如图4-4所示。

图4-4 关注作者与评论功能图
在程序中有一层关系叫做关注者与被关注者。这个功能用来在主页中一个页签中显示所有关注者的文章包括自己的。数据库中运用follows表来记录关注问题。所以在显示已关注者的页签时,使用表的联查来获取所有关联的博客文章。如果想取消用户之间的联系,可以单击取消关注按钮,通过数据库中记录的删除来实现。
个人资料中还可点击粉丝来查看关注自己的用户信息,关注按钮则是跳转到用户自己关注的作者的信息界面。
用户具有对博客系统中文章评论的权限,但是拥有评论的权限也必须履行言论正当的义务。当用户使用不恰当的言行时,言论管理员可以将改评论置为不可见,理论上不从数据库中删除。超级管理员不仅可以编辑已发布的博客文章,还可以管理用户的评论,也是将评论置为不可见。

4.2 数据库设计
在博客系统中涉及到很多用户之间的交互,良好的边间关系显得尤为重要。系统中总共6个表,分别为版本表version、评论表comments、关注表follows、博客文章表posts、角色表roles、用户表users。版本表在本系统中作用不大,只是为了以后的功能扩展做铺垫。系统中数据库表关系如图4-5所示。
图4-5 表间关系图
1、角色表roles中,存储的是用户的3种角色。各个字段如下图表4-1所示。
字段名 类型 长度 默认值 字段说明
id integer 0 PK主键
name varchar 64 用户名UNIQUE
default boolean 0 默认为用户
permissions integer 0 用户权限值
表4-1 角色表
每一个用户注册,id自动加1,用户名和数据库中的用户名进行比较,没有相同的则可以申请。注册账号时,博客系统默认使用者为用户,所以只有普通用户的default字段为true,普通用户、言论管理员、管理员的权限值分别为7、15、255。
2、用户表users如图4-2。
字段名 类型 长度 默认值 字段说明
id integer 用户编号PK
username varchar 64 用户名
role_id integer 用户角色编号
email varchar 64 用户邮箱地址
password_hash varchar 128 密码哈希散列值
confiremed boolean 邮箱是否确认
about_me text 关于作者资料
last_seen datetime 上次登录时间
location varchar 64 位置
member_since datetime 加入博客系统的时间戳
name varchar 64 用户姓名
avatar_hash varchar 32 邮箱散列值
表4-2 用户表
用户表中用户id作为主键,用户名不可重复。role_id为roles表中的id,作为此表中的外键,用来确定用户属于那种角色。邮箱地址、加入系统的时间都是在注册的时候就填写的。密码的哈希散列值则是通过输入的密码进行转化得来,邮箱散列值也是如此。
3、关注表follows如表4-3所示。
字段名 类型 长度 默认值 字段说明
follower_id integer 关注者id
followed_id interger 被关注者id
timestamp datetime 时间戳
表4-3 关注表
关注表中关注者id和被关注者的id联合起来作为主键,这样防止关系的重复。用户在关注其他用户的时候,单击关注时会产生一个时间戳一起写到数据库中。
4、博客文章表posts如表4-4所示。
字段名 类型 长度 默认值 字段说明
id integer 博文编号
body text 博文主体
timestamp datetime 时间戳
author_id integer 作者id
body_html text Markdown语法的博文
表4-4 博客文章表
博客文章表中,body字段为用户发表博文的原始字段,经过Markdown的语法处理之后转化成html语法存储在body_html字段中。同样在编辑的时候,会产生一个时间戳和作者id来标示博客文章。
5、评论表comments如4-5所示。
字段名 类型 长度 默认值 字段说明
Id Integer 评论编号
Body Text 评论主体
Body_html Text 评论主体html
Timestamp Datetime 时间戳
Disable Boolean 是否显示
Author_id Integer 评论人编号
Post_id integer 博文编号
表4-5 评论表
评论时和发布博客文章一样,评论的主体会经过Markdown语法进行翻译,存储到body_html中去。在评论中,支持的语法相对较少,防止和博文一样复杂化。评论会和评论者的编号和所评论的博客文章编号进行关联。

第五章 系统功能模块实现
系统功能模块的实现是对系统设计基础上的进行模块的编码,为源代码提供说明。所有Flask框架的程序都要创建一个程序实例。Web服务器使用Web服务器网关接口协议,把来自客户端的请求传送给程序实例。程序实例要求知道每个URL对应的代码,处理函数与URL的关系代码成为路由。程序实例运用run方法来启动Flask集成开发的服务器。如果使用调试模式时,将app.run()函数中的参数设置为true。
数据库连接使用Flask-SQLAlchemy库。SQLite数据库不需要使用服务器,所以不用指定hostname、username、和password。程序使用的数据库URL必须保存在Flask配置对象的SQLALCHEMY_DATABASE_URI中。初始化并配置SQLite数据库代码如下。
from flask.ext.sqlalchemy inport SQLAlchemy
basedir = os.path.abspath(os.path.dirname(file))
app = Flask(name)
app.config[‘SQLALCHEMY_DATABASE_URI’] =
‘sqlite:///’+os.path.join(basedir,’data-dev.sqlite’)
app.config[‘SQLALCHEMY_COMMIT_ON_TERDOWN’] = true
db = SQLAlchemy(app)

5.1 注册及用户认证
5.1.1 用户注册
在博客系统中,用户只有在登录的情况下才能评论博客、关注作者,所以使用者必须先注册账号。在注册时的流程图5-1如下。

图5-1 用户注册流程图
注册账号主要代码如下。
class RegistrationForm(Form):
email = StringField(u’邮箱账号’, validators=[Required(), Length(1, 64), Email()])
username = StringField(u’用户名’, validators=[
Required(), Length(1, 64), Regexp(‘1[A-Za-z0-9_.]*$’, 0,‘Usernames must have only letters,numbers, dots or underscores’)])
password = PasswordField(u’密码’, validators=[
Required(), EqualTo(‘password2’, message=u’密码必须一致!‘)])
password2 = PasswordField(u’确认密码’, validators=[Required()])
submit = SubmitField(u’注册’)
主要对用户名和邮箱进行了正规化的校验,并且确认用户注册时用户名和邮箱账号不能重复。
5.1.2 用户认证
用户在首次登录时,必须你打开确认邮件,才可按不同角色跳转到不同的界面中。流程如下图5-2所示。

图5-2 用户登录流程图
对于游客,博客系统只显示所有的文章,发表评论和发表博客文章的表单将隐藏起来。所以在注册后,用户登录会跳转到不同的界面,普通用户可以发表博客文章和评论,并且只可以修改自己的文章。而管理员则可以修改任何人的文章,当然也可以发表自己的博客文章和评论。
5.2 用户资料
用户在登录后可以修改自己的用户资料。包括修改自己的邮箱地址、密码、姓名、位置、以及个人简介。其流程如下图5-3所示。

图5-3 修改个人信息流程图
系统使用者在点击编辑资料时,根据上述的流程图中,首先判断使用者的身份。若使用者为用户时,界面如图5-4。

图5-4 用户编辑个人资料图

而当使用者为管理员时,界面如图5-5。

图5-5 管理员编辑个人资料图
管理人员可以编辑用户的基本信息,还可以编辑用户自己不可编辑的字段,比如:用户名、角色、是否确认这三项,并且在修改邮箱的时候也不需要对邮箱发送确认邮件了。
5.3 博客文章
此模块的用户是所有登陆的用户、言论管理员、管理员,游客不能发表任何文章。撰写博客文章时,可以使用Markdown的语法来将文章格式化。博客系统的首页要显示一个表单,以便于用户撰写博客文章。表单很简单,只有一个文本输入框,用户输入博客文章。在输入的同时,会运行JavaScript及时将博客文章转化成html语言,显示在预览框中。
由于博客系统的用户不会只限制于几个,所以在展示博客文章的时候要用到分页。使用分页时要使用很多的数据。博客系统中使用ForgeryPy库来进行自动化生成数据。将数据添加到User模型和Post模型中,生成虚拟数据。核心代码如下。
def generate_fake(count=100):
from sqlalchemy.exc import IntegrityError
from random import seed
import forgery_py

    seed()
    for i in range(count):
        u = User(email=forgery_py.internet.email_address(),
                 username=forgery_py.internet.user_name(True),
                 password=forgery_py.lorem_ipsum.word(),
                 confirmed=True,
                 name=forgery_py.name.full_name(),
                 location=forgery_py.address.city(),
                 about_me=forgery_py.lorem_ipsum.sentence(),
                 member_since=forgery_py.date.date(True))
        db.session.add(u)
        try:
            db.session.commit()
        except IntegrityError:
            db.session.rollback()

上述为User模型数据的自动化生成,Post模型的数据也是这个原理。当博客文章满足一定条件后,页面的渲染只会显示有限数量的文章,如果要想访问其他页数的博客文章需要在浏览器地址栏中加上URL进行查询。
在Flask-SQLAlchemy中paginate()方法中定义每页显示的数量,默认值为20条记录。分页导航是以Jinja2宏来实现,这个宏以Bootstarp的分页元素定义。如果当前页数为1,“上一页”链接则置为不可用。同样,当当前页为最后一页,“下一页”按钮也将会置为不可用。分页对象迭代器返回的所有页面链接,被渲染成有页数的链接,显示时使用activeCSS类高亮显示。
每一篇博客文章应该有一页专页,引用唯一的URL,便于向社交网络中分享自己的文章。只要代码如下:
@main.route(‘/post/int:id’, methods=[‘GET’, ‘POST’])
def post(id):
post = Post.query.get_or_404(id)
form = CommentForm()
只允许博客文章的作者进行编辑文章时,要用到视图函数。但是管理员可以修改任何一个人的博客文章。如果普通用户尝试编辑其他用户的文章时,视图函数会返回错误代码403。实现方式:
def edit(id):
post = Post.query.get_or_404(id)
if current_user != post.author and
not current_user.can(Permission.ADMINISTER):
abort(403)
form = PostForm()
为了完善功能,在每一条博客文章的右下角有3个按钮。分别链接到编辑博客文章界面、文章的URL、评论界面。为了区别和普通用户的编辑,在编辑按钮上的样式使用了不同的样式来区分角色。
5.4 关注作者
在数据库中使用表来创建用户之间的关系。数据库关注表中总共3个字段,关注者id、被关注者id、关注时间。当关注者id和被关注者id相同时,这层关系叫做自引用关系。关注者id、被关注者id都是表的外键,与用户表的数据对应。关注者和被关注者又形成了关注表的主键。在点击作者用户名后,页面跳转到用户资料界面。点击关注按钮后,按钮变成取消关注,同时改作者的资料中显示粉丝人数少了一名。如下图5-6所示。

图5-6 个人资料界面图
程序中使用follow()方法将实例创建,插入到follow表中,从而把关注者和被关注者关联起来,连接在一起的两名用户被传到follow类的构造器中,创建一个Follow的新实例,并且将实例对象添加到数据会话中。在创建的同时,要系统会生成一个时间戳,即当前时间,一起添加到数据库中。取消关注时,使用unfollow()方法找到关注者和被关注者的连接关系,删除这个Follow对象就能实现。
在关注成功后,目的是把所有关注的作者的文章集中到一个界面中来显示。这时候使用数据库的联查来实现。想要显示所有的关注作者的文章,第一步先获取这些用户信息,然后通过表的中id获取各个用户的文章,通过文章生成时的时间戳来进行排序,单独写到一个列表中。但是这种操作方式可伸缩性差,随着数据库中数据的不断增长,列表工作量也会增长,无法保持高效率的执行。这时候需要使用联结操作。当查询的时候查找满足条件的记录组合,再把记录写入到一个临时表中,这就是联结查询所得到的结果。
5.5 评论管理
用户在登录博客系统中有发表评论的功能,而评论和博客文章本质上没有什么区别。都是使用了Markdown的语法。评论是属于某一篇博客文章的,所以定义了一个关系,从posts表与comments表形成一对多的关系。使用这层关系,可以获取到特性一篇文章的所有评论。在博客系统中,评论要显示在对应的单片博客文章中。点击博客文章界面上的编辑按钮,界面就跳转到评论的链接,一个能提交评论信息的表单也要在此界面中。这个表单相对其他表单来说,比较简单,只有一个字段和按钮。
评论按照时间戳进行排序,先评论的显示在最前面。评论也使用了与博客文章相同的技术来实现分页效果。评论的渲染过程在模板_comments.html中,类似于_posts.html,使用的css样式却不同。评论要显示在文章的正下方,然后在显示分页导航栏。博客文章页面中有显示文章的评论数量,评论数量是使用的SQLAlchemy提供的count()方法来进行计数。
管理评论时,有两种角色有权限,分别为言论管理员和管理员。他们用户的权限为permission.moderate_connemts,拥有此权限可以对博客系统中的任意一条评论进行管理。管理界面中,在列表显示全部用户的评论记录,按照发布的时间最近开始排序。每一篇博客文章右下角都有一个disabled按钮,点击按钮,评论将视为不可见。但是在视图中,对于普通用户来说,不显示标记有问题的评论。对于言论管理员来说,不管是否被标记为有问题,都要显示出用户评论的内容。评论路由定义如下:
@main.route(‘/moderate/enable/int:id’)
@login_required
@permission_required(Permission.MODERATE_COMMENTS)
def moderate_enable(id):
comment = Comment.query.get_or_404(id)
comment.disabled = False
db.session.add(comment)
return redirect(url_for(‘.moderate’,
page=request.args.get(‘page’, 1, type=int)))

@main.route(‘/moderate/disable/int:id’)
@login_required
@permission_required(Permission.MODERATE_COMMENTS)
def moderate_disable(id):
comment = Comment.query.get_or_404(id)
comment.disabled = True
db.session.add(comment)
return redirect(url_for(‘.moderate’,
page=request.args.get(‘page’, 1, type=int)))

第六章 系统测试
6.1 测试环境

  1. 装有windows7系统的pc机。
    Python程序理论上可以在多个平台上运行,可以在windows或者linux上都可以运行。由于在windows系统中开发的,所以直接用同了一个系统。
  2. 安装Python。
    如果没有安装Python安装包,就相当于没有安装JDK运行Java代码。安装Python后,还要使用pip命令安装一些程序必须要引用的库,例如flask的一系列库。
  3. 浏览器chrome。
    浏览器是web应用性能检测的重要工具。根据浏览器的测试页面的结果,进行针对性的优化。
    6.2 测试目的
    软件开发的最基本的要求是时间和质量。而软件测试是软件质量保证的最重要的手段之一。对于软件来说,无论采用什么技术和方法进行开发,产品都会有bug。采用比较全面的技术测试可以减少错误的存在,提高软件的运行时的稳定性。在整个软件的生命周期中,每个阶段、每个时间都存在软件测试活动,软件测试伴随着软件开发,检验每个阶段的成果是否符合质量要求并且达到预期的目的,尽早的发现并且改正程序中的错误。
    编写单元测试的主要目的有两个,一是能够确保新添加的代码按照预期的方式运行。二是每次修改程序后,运行单元测试能保证现有的代码功能依旧能用。
    6.3 测试内容
    1、登陆功能模块:
    1)用户用注册过的邮箱账号可密码进行登陆,是否能验证成功,并且跳转到主页面;

  1. A-Za-z ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值