常见问题      欢迎来到牛博士论文网, 本站提供、本科毕业论文范文硕士论文范文博士毕业论文范文发表职称论文范文,牛博士用心为您服务!欢迎关注微信公众号   
理工论文毕业论文分类>>
毕业论文怎么写更多写论文技巧>>
关于我们
    牛博士论文网经过十余年的心酸代写历程,我们起初的梦想逐渐变成了现实,已经发展成为了一个本科、硕士、博士研究生毕业论文代写代发为主的代写毕业论文平台。十二年专注致力于博士硕士专本科论文代写服务这一核心业务模块,让我们成为了业内有序经营时间最长的综合性论文网站之一,拥有丰富的服务经验和社会资源。合作的写作老师已有2000多位,均为有丰富实践经验的高学历专业人才,以保证文稿的质量与版权,为广大毕业生解决经济、管理、法律、医学、会计、体育、历史、教育教学、建筑等专业的毕业论文及代发代写论文等服务,强大的写作团队奠定了我们的实力! 我们相信通过我们的不断努力和追求,一定能够实现与客户的互利共赢!

基于Django的B/S微博系统——后端程序设计与开发

本站原创   发布时间:2019-01-04   [点击量:1430]  


这是一篇计算机毕业设计毕业设计论文、也教大家毕业设计怎么做。关注牛博士论文网(www.211nbs.com),每日分享毕业论文范文,也提供毕业论文代写,代写毕业论文,代写硕士论文,论文发表,服务广大学子,帮助完成学业,顺利毕业!


内容摘要

 

     本文开发了一套基于B/S的微博系统,其主要以Django作为Web开发框架,以Python为后台开发语言,以Mysql作为后台数据库服务器,运用Django的模板渲染系统实现前后端逻辑设计分离,前端向后端服务器提交POST请求,服务器接收到POST请求之后运用Django的ORM框架映射对Mysql数据库进行操作,将数据库返回的变量结果嵌入到HTML中渲染后,再返回到前端浏览器中进行呈现,实现了微博系统的个人资料模块、文章模块、想法模块、社区模块、私信模块、搜索模块与问答模块等功能需求,提供了相对开放的共享沟通机制以便群体进行沟通交流与共享,较好地迎合与匹配了现代人的思想与个性化需求

 

 

关键词:微博系统;MVC设计模式;Python;Django


 一、微博系统功能介绍

微博作为新媒体的代表已经极大地影响和改变了人们工作与生活的方方面面[1],微博依托于主流网站微博客平台专门开设,根据其所属对象分类可分为个人微博与官方微博[2],个人微博主要用于发布个人在工作与生活中的点滴与日常,是个人进行情感宣泄与工作生活记录的在线式平台[3],官方微博用于发布企业信息、倾听用户意见、收集客户需求信息,是一种集服务客户、品牌维护、危机公关、产品营销、价值推广等活动于一体的企业官方网络互动平台[4]。微博系统是新媒体时期互联网技术与社会群体之间相关碰撞而衍生的产物,因其公开性、共享性、互动性、即时性、自主性而深受广大网民的热爱与追捧,具有非常深厚的用户基础与广泛的应用前景[5]。鉴于此,本文设计并实现了一款基于Django的B/S微博系统,为本微博系统的用户提供一个在线式信息管理与共享交流平台。

本文所设计与实现的微博系统的基本功能包括如下七个模块:

(1)个人资料模块

个人资料模块中的子功能模块包括用户注册模块、用户登录模块、用户个人资料管理模块等,其中用户注册模块是微博系统的每一位新用户都需要使用的功能模块,新用户必须注册之后才能拥有微博系统其他功能的使用权限[6];用户登录模块为用户登录到微博系统提供功能服务,已经注册之后的用户可以运用注册的用户名、密码等信息登录到微博系统中;用户个人资料管理模块用于对用户自身的个人信息进行编辑、完善、查看,并将前端编辑修改后的信息更新到后台数据库服务器中。

(2)文章模块

文章模块是一个综合和完整的博客平台,微博系统的用户可以将自己的所获所感以文字与图片的形式编写成文章,并在微博系统上进行公开发布。用户也可以对已经发布的文章进行重新编辑或者删除,根据个人需求管理个人微博账户下的文章[7]。文章模块中,微博用户在发布文章时需要为文章添加标签属性,以便于后期的文章关键词检索与查找。此外,用户可以浏览查看到其他微博用户发布的文章,并进行评论,与文章发布人之间形成良好的沟通交流机制。

(3)想法模块

想法模块是一个短微博平台,其区别于文章模块之处在于,想法模块中发布的想法篇幅通常较短,所记录的也都是微博用户的日常生活琐事与感想,主要以文字为主,微博用户可以随时将自己的生活与工作经历以及所思所感发布成想法,为微博用户发表想法与管理想法提供了非常便捷的功能,用户可以查看以往的想法,也可以对社区内其他微博用户所发表的想法进行评论发表与点赞、取消赞、删除评论等,是一种短、平、快的沟通交流机制。

(4)社区模块

社区模块用于对所有在微博系统上注册的用户进行统一管理,微博用户可以通过社区模块查看到所有微博系统注册用户,点击某一注册用户即可查看到该用户的详细资料信息,便于微博用户在所有注册用户中寻找到与自己兴趣爱好相同或类似的用户进行沟通交流。

(5)私信模块

私信模块是一个即时通信系统,微博用户可以注册微博系统的用户发送私信进行聊天,私信发送完成后,私信的接收人会收到消息提醒,及时查看所接收的私信[8]。私信模块为微博平台的用户提供了一个极具互动性的交流平台,是本微博系统中的亮点。

(6)搜索模块

搜索模块可以搜索微博系统中的所有信息,包括文章、问答、想法以及其他用户,微博用户可以在搜索模块中输入关键词,微博系统会在全站内进行全文检索,搜索到与该关键词相吻合的所有微博记录,搜索模块是内嵌在各个功能模块之下的,用户可以在各个模块下进行关键词搜索,例如在问答模块下进行搜索关键词,则会检索出所有与关键词相关的问答。

(7)问答模块

问答模块是微博系统中极具交互价值与学习价值的模块,微博用户借助问答模块可以进行提问,所涉及的话题非常广泛,如工作、学习、娱乐、生活等,通过给提问附加上标签,以便于区分不同的问答内容;回答模块支持微博用户进行问题答复,微博用户可以以文字与图片的形式组织答复内容,并将其发布到相应的问题回复区[9];微博用户也可以进入到问答模块下查看所有的问题与回答,将问答模块作为疑问解惑与学习的重要工具。


二、相关知识与关键技术简介

  (一)相关知识

1. B/S架构

B/S架构采取浏览器请求,服务器响应的工作模式,用户可以通过浏览器去访问Internet上由Web服务器产生的文本、数据、图片、动画、视频点播和声音等信息[10];而每一个Web服务器又可以通过各种方式与数据库服务器连接,大量的数据实际存放在数据库服务器中;从Web服务器上下载程序到本地来执行,在下载过程中若遇到与数据库有关的指令,由Web服务器交给数据库服务器来解释执行,并返回给Web服务器,Web服务器又返回给用户[11]。B/S架构的工作原理如图1所示。

基于Django的B/S微博系统——后端程序设计与开发

图1 B/S架构的工作原理

B/S架构的工作流程如下[11]:

(1)客户端发送请求: 用户在客户端【浏览器页面】提交表单操作,向服务器发送请求,等待服务器响应;

(2)服务器端处理请求: 服务器端接收并处理请求,应用服务器端通常使用服务器端技术,如JSP等,对请求进行数据处理,并产生响应;

(3)服务器端发送响应: 服务器端把用户请求的数据(网页文件、图片、声音等等)返回给浏览器。

(4)浏览器解释执行HTML文件,呈现用户界面。

2. MVC模式

MVC设计模式如图2所示,M为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作,在本系统中是操作ORM框架的部分。V为View,用于封装结果,生成页面展示的html内容,在本系统中是Django的模板部分。C为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更。

基于Django的B/S微博系统——后端程序设计与开发

图2 MVC设计模式

  (二)前端开发技术

基于B/S的微博系统的前端主要运用Axure软件对系统的原型与界面进行设计,运用photoshop软件对前端相关素材进行准备,以使得准备好的素材能够达到界面与原型设计的效果与要求;然后采用HTML+CSS+Bootstrap技术实现前端内容的填充、美化与交互操作,将原型设计的界面在网页端呈现出来;以Django作为Web开发框架,通过Django的模板系统实现前后端逻辑设计分离,在服务器端把后端的变量嵌入到HTML中渲染后,返回给浏览器来达到前后端代码分离、页面动态显示的目的。 

  (三)后端开发技术


1. Django框架

Django是一个开放源代码的Web应用框架,由Python写成。采用了MVT的软件设计模式,即模型Model,视图View和模板Template。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。Django不止是一个Web开发框架,同时也是一个ORM框架,基于Django框架的典型业务流程如图3所示。本系统使用Django 2.0,同时使用了Django的Web框架功能和ORM框架功能。

基于Django的B/S微博系统——后端程序设计与开发

图3 Django框架的典型业务流程图

2. ORM框架映射

对于如今的软件应用系统来说,用户产生的数据量越来越大,数据库是必不可少的。一种常见的操作数据库的做法是直接在程序中拼接sql语句的字符串来操作数据库。这样做会造成大量重复的代码,也将数据库操作和业务逻辑代码混到一起,造成代码可读性差[12]。对象-关系映射(Object-Relational Mapping,简称ORM)框架,允许开发者直接使用操作对象(包括修改对象属性和调用对象方法)的方式来进行数据库操作,由ORM框架来将对象间的关系映射成对应的sql语句来进行数据库操作。能够大大提高开发效率,降低开发成本,提高代码可读性。当前业界流行的ORM框架有structs2(Java),GORM(GO)等[13]。本微博系统中使用了Django自带的ORM框架,所有数据库操作全部使用ORM框架,不直接使用sql语句。

3. Python

Python,是一种广泛使用的高级编程语言,属于通用型编程语言,由吉多·范罗苏姆创造,第一版发布于 1991 年。作为一种解释型语言,Python 的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。相比于 C++ 或 Java,Python 让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。Python 拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且支持多种编程范式,包括面向对象、命令式、函数式和过程式编程,本身拥有一个巨大而广泛的标准库,这也使得Python成为了当前主流开发语言之一。

4. WebSocket

对于Web开发来说,使用最多的协议就是htpp协议,但是http协议存在一个缺陷:http是一个请求响应协议,即:客户端发一个请求,服务端给一个对应的响应,服务端不能主动给客户端推送消息[14]。对于如今的web开发来说,需要服务端主动推送消息给客户端的场景越来越多,例如,基于web的即时通讯系统,当用户A发送消息给用户B时,通常需要服务器主动推送消息给用户B的浏览器以求用户B能及时收到消息。在WebSocket之前,一般客户端主动轮询服务端以求及时收到消息,例如,客户端每隔一秒给服务端发送一个请求询问是否有新消息,这样做会浪费大量的cpu和网络资源[15],于是,WebSocket就应运而生了。WebSocket是一种在单个TCP连接上进行全双工通讯的应用层协议[16]。即,服务端可以主动给客户端推送消息同时客户端也可以主动给服务端推送消息。在本系统中,动态提示功能和私信功能都使用到了websocket技术[17]。动态提示是指有人评论了用户A的文章、想法等是,服务端会将这个事件通过Websocket主动推送给用户。私信功能也如此类似,当有人给用户A发了私信,服务端也会主动把这个私信推送给用户A。(如果用户A不在线,会存储在缓存中当用户A在线时再推送)[18]。

5. Mysql数据库

Mysql是一个功能完备的数据库管理系统,它包括支持开发的引擎、标准的SQL语言、扩展的特性等功能,另外,Mysql数据库有B/S模式,该模式方便开发者随时随地读取数据库中的内容,并且在B/S模式下该数据库的安全性和稳定性的优点,能够得到最大程度的发挥。   

三、开发工具及其环境

  (一)开发工具

本文基于B/S的微博系统的后端主要以Django作为Web开发框架,以Python为后台开发语言,以Mysql作为后台数据库服务器,运用Django的模板渲染系统实现前后端逻辑设计分离,前端向后端服务器提交POST请求,服务器接收到POST请求之后运用Django的ORM框架映射对Mysql数据库进行操作,将数据库返回的变量结果嵌入到HTML中渲染后,再返回到前端浏览器中进行呈现。

  (二)开发环境


1. 硬件环境

CPU:Pentium 2.5GHz及以上,可升级双处理器;

内存:16GB或更高;

硬盘:1TB SATAⅡ;

电源:1U 450W。

2. 软件环境

操作系统:普通PC机(Linux系统);

浏览器:IE 11.0及以上、火狐、Chrome等;

Web开发框架:Django;

数据库服务器:Mysql。


    四、微博系统后端功能模块设计与实现

本文所设计的基于B/S的微博系统,其功能模块分为个人资料模块、文章模块、想法模块、社区模块、私信模块、搜索模块与问答模块等,本章节重点对这七个功能模块的后端具体实现、操作步骤等进行详细阐述。

(一)个人资料模块

个人资料模块的主要功能包括用户注册、用户登录与用户个人资料管理。Django提供了一个自带的认证模块,提供了添加用户和认证用户的功能,在本微博系统的代码中另外设计了一个ProfileFORM类(会被ORM框架映射成一个数据库表),用来表示用户的基本资料,并通过ID将ProfileFORM类和Django提供的用户认证模块对应起来,即可实现用户注册添加与用户登录认证,ProfileFORM类的具体实现代码如下:

class ProfileFORM(fORMs.ModelFORM):
first_name = fORMs.CharField(
widget=fORMs.TextInput(attrs={'class': 'fORM-control'}),
max_length=30, label='名字', required=False)

用户注册采用的是Django框架的添加用户功能,前端将用户名username、密码password、邮箱email通过POST请求传递给后台服务器,后台服务器执行request函数,首先判断用户是否已经注册,如UniqueEmailValidator()函数用于验证邮箱是否注册,UniqueUsernameIgnoreCaseValidator()函数用于验证用户名是否已经使用,InvalidUsernameValidator()函数用于验证用户名是否合法,若是上述函数调用均返回false,则继续执行注册函数,否则将退出注册函数;然后调用Django框架的添加用户功能User.objects.create_user(username=username, password=password, email=email)在后台数据库服务器中实现用户注册。

用户注册之后即可在运用注册的用户名与密码登录微博系统,用户登录功能的流程逻辑相对简单,只需将用户填入的用户名与密码作为参数传递给Model,由Model调用ProfileFORM类以及Django提供的用户认证模块user = authenticate(username=username, password=password)进行用户名与密码的联合认证工作,若是认证通过则执行login(request, user)函数登录微博系统。

(二)文章模块

文章模块的主要功能包括用户发布文章、查看文章、发表评论、点赞、删除文章、取消赞、删除评论、文章预览、文章草稿存储等。为了实现文章模块,在后台代码中设计了一个Article类,这个类会被ORM框架映射为一个数据库表,表中的字段包括标题title、内容content、标签tags、文章状态status。title为文章的标题,其数据类型为CharField、最大长度max_length=255,要求不为空且是唯一值;status是指文章的编辑状态,其数据类型为CharField,编辑状态包括“DRAFT”——草稿状态、“PUBLISHED”——发布完成状态两大类。

文章模块的核心API接口包括/articles/write/、/articles/preview/,/articles/drafts/、/articles/comment/等,下文分别对这四个核心接口进行详细阐述。

1./articles/write/接口

微博用户点击“写文章”button,触发createarticle()函数,向服务器端发送post请求,调用/articles/接口:url(r'^write/$', views.CreateArticle.as_view(), name='write'),执行CreateArticle.as_view()函数。

2./articles/preview/接口

微博用户点击“预览”button,触发函数$(".preview").click(function (){});,函数获取文章中输入的标题、内容等信息,并将这些参数以post的形式传递给后台服务器,调用/articles/preview/接口:url(r'^preview/$', views.preview, name='preview'),执行preview()函数,函数首先判断参数来源是否为post:if request.method == 'POST',若是,则采用post方法接收前端传递的相关参数,例如内容content的接收:content = request.POST.get('content');然后调用markdown.markdown函数对content进行预览展示:markdown.markdown(content, safe_mode='escape')。

3./articles/drafts接口

微博用户点击“草稿存储”button,触发函数$(".draft").click(function (){});,函数获取文章中输入的标题、内容等信息,并将这些参数以post的形式传递给后台服务器,调用/articles/drafts/接口:url(r'^drafts/$', views.drafts, name='drafts'),执行drafts()函数,首先获取Article的静态变量DRAFT值并赋予status,获取request.user值赋予create_user;然后执行Article.objects.filter(create_user,status)函数将文章草稿存储到相应的数据库表中。

4./articles/comment接口

微博用户在浏览器端输入相关评论内容之后,点击“评论”button,触发("#comment").keydown(function (evt) {});函数,经由该函数将评论内容获取到,并将这些参数以post的形式传递给后台服务器,调用/articles/comment/接口:url(r'^comment/$', views.comment, name='comment'),执行comment()函数,首先判断参数来源是否为post:if request.method == 'POST',若是,则采用post方法接收前端传递的相关参数article_id、article、comment,例如评论comment的接收:comment = request.POST.get('comment');同时需要对comment进行去空处理comment = comment.strip();然后对comment变量的长度进行判断,若是长度大于0则表明有评论内容,调用freebyte.articles.models的ArticleComment函数返回评论变量,并调用成员函数save:article_comment.save()将文章评论存储到相应的数据库表中。

(三)想法模块


想法模块的主要功能包括用户发表想法,查看想法,发表评论,点赞,删除想法,取消赞,删除评论。为了实现想法模块,在代码中设计了一个Feed类,这个类会被ORM框架映射成一个数据库表。核心代码如下:

class Feed(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE) //作者
date = models.DateTimeField(auto_now_add=True) // 发布时间
post = models.TextField(max_length=255) // 内容
parent = models.ForeignKey('Feed', null=True, blank=True, on_delete=models.SET_NULL)
likes = models.IntegerField(default=0) // 点赞数
comments = models.IntegerField(default=0) // 评论数量

这个模块的核心API接口有:/feeds/、/feeds/post/、/feeds/like、/feeds/comment等,下面分别对这四个接口的功能和实现进行详细阐述。

1./feeds/接口

这个接口只能使用GET方法请求,会按时间倒序返回所有用户发表过的想法,会接受一个limit参数和一个offset参数用于分页。例如,前端传参数limit=10,offset=0的时候会返回用户最新发表的10条想法,limit=10,offset=1的时候会返回用户最新发表的20条想法中比较久远的10条。这个接口的实现主要是是调用了Feed类的get_objects()方法,即result = Feed.get_objects(offset, limit)。get_objects这个方法是Feed类继承自父类models.Model的方法,而models.Model是ORM框架提供的类,这个类会把get_objects方法映射成一个sql的select语句。

2./feeds/post接口

这个接口只能接受POST请求,当用户发布一个想法时,前端会使用javascript请求这个接口,后端对这个请求的处理是把这个想法存储到数据库中。核心代码是feed = Feed(),feed.Save()。其中Save方法是Feed类继承自父类models.Model的Save方法,models.Model的Save方法会生成一条对应数据库操作语句的ORM映射,插入feed对象到对应的数据库表中。

3./feeds/like接口

这个接口只能接受POST请求,当用户点赞或者取消点赞某一个想法时,前端会使用javascript请求这个接口,后端接受到请求会通过ORM框架更新数据库,将数据库中这个想法的点赞数加一(或者减一,如果用户已经赞过这个想法的话)。

4./feeds/comment接口

这个接口同时接受GET请求和POST请求,如果是GET请求,会返回某个想法的所有评论,前端请求这个接口时,会带上feed_id这个请求参数,后端会使用这个请求参数查询(利用ORM查询)数据库中这个feed_id的所有评论并返回给前端。如果是POST请求,会将一条评论添加到某个想法上,前端会同时传递feed_id和comment_content两个参数,后端会将comment_content作为一个单独的想法存储到数据库中并设置外键为feed_id。

(四)社区模块

本微博系统的社区模块主要是对社区内的所有微博用户进行展示,展示内容包括社区内微博用户的名称、头像、工作信息、地点以及个人主页的超链接等。社区模块的实现依托于前端与后台的配合,首先从后台users数据库表中查询到社区的所有用户信息,然后在前端使用{% for user in users %}即可实现对用户信息的循环查询,

用户名: {{ user.username }}

用于对循环查询中的用户名信息进行读取并展示在“用户名:”字符串之后,

工作信息: {{ user.profile.job_title }}

用于对循环查询中的用户工作信息进行读取并展示在“工作信息:”字符串之后,

地点: {{ user.profile.location }}

用于对循环查询中的用户地点信息进行读取并展示在“地点:”字符串之后。

(五)私信模块

私信模块的主要功能包括私信发送、私信记录删除、私信接收等。为了实现私信模块,在后台代码中设计了一个Message类,这个类会被ORM框架映射为一个数据库表,表中的字段包括接收用户user、私信内容message、私信发送时间date、发送用户from_user、是否已读is_read。message为私信的内容,其数据类型为TextField、最大长度max_length=1000;from_user是指发送用户,其定义为from_user = models.ForeignKey(User, related_name='+', on_delete=models.CASCADE);is_read为是否已读,其数据类型为BooleanField,默认为False,若是私信接收方已读,则其值更改为True。

私信模块的核心API接口包括/messages/send/、/messages/receive/等,下文分别对这两个核心接口进行详细阐述。

1./messages/send/接口

微博用户点击回车按钮Enter,触发$("#send").submit(function () {});函数,该函数获取到前端界面上用户输入的通信信息以及收件人,将上述参数进行序列化并传输给后台服务器,后台服务器调用/messages/send接口:url(r'^send/$', views.send, name='send_message'),执行send()函数,函数首先判断参数来源是否为post:if request.method == 'POST',若是,则采用post方法接收前端传递的相关参数,例如接收用户名to_user_username的接收:to_user_username = request.POST.get('to'),并将其转化为user类型:to_user = User.objects.get(username=to_user_username),私信内容message的接收:message = request.POST.get('message'),并对私信内容进行去空处理message= message.strip();然后判断私信message的长度是否大于0,若大于则表明私信中存在字符串,继续判断接收用户与发送用户是否为同一人:if from_user != to_user,若是该判断为True,则调用Message.send_message函数,函数中的参数包括发送人from_user、接收人to_user、私信内容message,实现私信的发送功能。

2./messages/receive/接口

微博用户发送私信给接收方后,在WebSocket协议下接收方可以自动调用ws_receive函数,通过old_message = json.loads(message.content['text'])自动加载私信的内容,并传输给后台服务器,后台服务器调用/messages/receive接口:url(r'^receive/$', views.receive, name='receive_message'),,执行receive()函数,函数首先判断参数来源是否为GET:if request.method == GET,若是,则采用GET方法接收WebSocket传递的相关参数,例如私信唯一编码message_id:request.GET.get('message_id'),私信内容message:message = Message.objects.get(pk=message_id);然后将私信内容message返回到partial_message前端html文件中:return render(request, 'messenger/includes/partial_message.html', {'message': message}),以实现收件人浏览器界面上的私信内容显示。

(六)问答模块

问答模块的主要功能包括用户提问、用户回答、回答接受、回答投票、问题投票等。为了实现问答模块,在后台代码中设计了一个Question类,这个类会被ORM框架映射为一个数据库表,表中的字段包括提问用户user、问题标题title、问题描述description、问题提出时间create_date、问题更新时间update_date、问题投票数votes、最受赞赏的回复favorites、是否有已接受的答案has_accepted_answer。title为问题的标题,其数据类型为CharField,最大长度max_length=255;description是指问题的具体描述,其数据类型为TextField,最大长度max_length=2000;has_accepted_answer为是否有已接受的答案,其数据类型为BooleanField,默认值为False,即没有已经接受的答案,当提问者认可某一答案时,则has_accepted_answer的值为True。

问答模块的核心API接口包括/questions/ask/、/questions/favorite/,/questions/answer/、/questions/answer/accept/、/questions/answer/vote/等,下文分别对这五个核心接口进行详细阐述。

1. /questions/ask/接口

微博用户点击“提问发送”button,触发askquestion()函数,向服务器端发送post请求,调用/questions/ask/接口:url(r'^ask/$', views.AskQuestion.as_view(), name='ask'),执行AskQuestion.as_view()函数。

2. /questions/favorite/接口

微博用户进入到问答模块时,自动触发并调用/questions/favorite/接口:url(r'^favorite/$', views.favorite, name='favorite'),执行favorite()函数,函数首先判断参数来源是否为post:if request.method == 'POST',若是,则采用POST方法接收前端传递的相关参数,例如提问编码question_id的接收:question_id = request.POST['question'],根据question_id获取到相应编码下的具体问题question = Question.objects.get(pk=question_id);然后调用Activity.objects.filter(activity_type=Activity.FAVORITE,user=user,question=question_id)返回最佳回复,若是最佳回复存在则将最佳回复置顶,否则则按照回复时间的顺序依次排列。

3./questions/answer/接口

微博用户进入到问答模块时,在回答文本框中输入相应的回复,点击“回复”触发并调用/questions/answer/接口:url(r'^answer/$', views.answer, name='answer'),执行answer()函数,函数首先判断参数来源是否为post:if request.method == 'POST',若是,则采用POST方法接收前端传递的已有回复序列,判断已有回复序列是否为空:if form.is_valid(),若是已有回复序列不为空,则对序列form进行解析,answer.user为回复用户、answer.description为问题描述等,然后将序列按照时间顺序进行排列并展示:redirect('/questions/{0}/'.format(answer.question.pk));若是已有回复序列为空,则表明该问题尚无人回复,则按照回复的既定格式将本次回复显示到前端浏览器中:render(request, 'questions/question.html', {'question': question,'form': form})。

4./questions/answer/accept/接口

微博提问用户在对所有已有回复进行浏览的基础上,可以选择某一条最为满意的回复作为接受回复,点击“接受”button触发accept()函数,经由该函数将回复答案的编码answer_id获取到,并将这一参数以post的形式传递给后台服务器,调用/questions/answer/accept/接口:url(r'^answer/accept/$', views.accept, name='accept'),执行accept()函数,首先判断参数来源是否为post:if request.method == 'POST',若是,则采用post方法接收前端传递的接受回复编码answer_id:answer_id = request.POST['answer'],根据answer_id获取到相应编码下的具体回复对象:answer = Answer.objects.get(pk=answer_id);然后执行answer.accept()函数,更改是否已有接受回复has_accepted_answer的值为True。

5./questions/answer/vote/接口

微博用户(包括提问者与访客)可以对回复进行点赞投票,点击“点赞”小图标时触发vote()函数,经由该函数将回复答案的编码answer_id获取到,并将这一参数以post的形式传递给后台服务器,调用/questions/answer/vote/接口:url(r'^answer/vote/$', views.vote, name='vote'),执行vote()函数,首先判断参数来源是否为post:if request.method == 'POST',若是,则采用post方法接收前端传递的接受回复编码answer_id:answer_id = request.POST['answer'],根据answer_id获取到相应编码下的具体回复对象:answer = Answer.objects.get(pk=answer_id),接受投票数vote:vote = request.POST['vote'];然后执行answer.calculate_votes()函数,统计最新的回复投票数,并将其返回给前端浏览器进行显示。

(七)搜索模块

搜索模块内嵌在文章模块、想法模块、问答模块、社区模块等功能模块之中,其搜索类型search_type的列表为['feed', 'articles', 'questions', 'users'],对于不同的搜索类型,搜索模块检索的样本集是不同的。在微博搜索文本框中输入搜索信息,点击搜索小图标,即可触发Search函数,函数获取搜索关键词,并以GET的方式传递给后台服务器,后台服务器调用/search/接口的search函数,首先获取GET方式传递的搜索关键词并做去空处理:querystring = request.GET.get('q').strip();然后判断querystring的长度是否大于0,若大于0则表明搜索关键词不为空,继续向下执行,判断搜索关键词所指向的信息集合类型(search_type),主要分为四大类:其一为想法模块feed,调用/feeds/feed接口,指向“想法”信息集合,其二为文章模块article,调用/articles/article接口,指向“文章”信息集合,其三为社区模块,调用/users/user接口,指向“微博用户”信息集合,其四为问答模块question,调用/questions/question,指向“问答”信息集合。想法搜索调用Feed.objects.filter(post__icontains=querystring,parent=None)函数,返回检索数据集到results['feed']中,文章搜索调用Article.objects.filter(Q(title__icontains=querystring) | Q(content__icontains=querystring), status='P')函数,返回检索数据集到results['articles']中,问答搜索调用Question.objects.filter(Q(title__icontains=querystring) | Q(description__icontains=querystring))函数,返回检索数据集到results['questions']中,用户搜索调用User.objects.filter(Q(username__icontains=querystring) | Q(first_name__icontains=querystring) | Q(last_name__icontains=querystring))函数,返回检索数据集到results['users']中;接着运用results结果集的count()函数统计查询结果的条数;最后将检索关键词querystring、搜索类型search_type、检索结果集results以及检索结果条数count均返回给前端results.html,用于在前端进行获取与展示。


    五、结论

本文通过熟练运用Django框架、Python开发语言、Mysql数据库、WebSocket协议、ORM框架映射等完成了对微博系统后端的设计与实现工作,主要设计与实现的功能模块包括个人资料模块、文章模块、想法模块、社区模块、私信模块、搜索模块与问答模块共七部分,通过对上述七个能模块进行数据库设计与后端开发实现,使得微博用户可以在本微博系统上注册登录之后进行文章的发布、在线私信沟通、答疑解惑、发表想法、文章浏览与评论、微博搜索等操作,满足了现代网民对公众共享与交流平台的需求。通过本B/S微博系统的后端设计与实现,本人也从中获益良多,充分熟悉了MVC模式下的前后端分离设计、后端的开发框架、后端开发语言、前后端交互以及后端的数据库表设计与操作,加深了本人对于Web开发的理解深度。


参考文献

[1]  邵凤,郭强,曾诗奇,刘建国.微博系统网络结构的研究进展[J].电子科技大学学报,2014,43(02):174-183.

[2]  黄勤.基于NET平台的学生微博系统设计与实现[J].西安文理学院学报(自然科学版),2012,15(04):99-103.

[3]  胡阳,刘延军,柴亚刚.城市微博与无线政务平台建设思考[J].中国传媒科技,2012(17):55-58.

[4]  程渊.南阳医专校园网微博系统的设计[J].数字技术与应用,2012(04):162.

[5]  杨佳霈.基于大型事企业单位员工的微博交流系统[J].电脑编程技巧与维护,2018(01):77-79.

[6]  李磊.基于Redis的微博系统基本功能设计[J].电脑知识与技术,2016,12(25):61-63.

[7]  刘国庆.基于Web微博系统的研究与实现[J].产业与科技论坛,2016,15(15):32-33.

[8]  吴松,徐鲁强,钟琳.高校教育微博系统的应用模式探讨[J].民营科技,2012(02):71.

[9]  邓喆,兰楠,谢满祥.基于Hadoop平台的类Twitter微博系统的开发与实现[J].福建电脑,2015,31(07):1-3.

[10]  李书杰,李志刚.B/S三层体系结构模式[J].河北理工学院学报,2002(S1):25-28+34.

[11]  余东升,陆青,冷亚军.基于B/S模式的自助旅游管理系统的设计与实现[J].内蒙古科技与经济,2017(19):61-62.

[12]  周志刚,王彬.ORM框架的底层实现机制[J].软件导刊,2011,10(02):8-9.

[13]  徐茹枝,丁昊志,单波.对象关系映射框架的研究与设计[J].华北电力大学学报,2006(04):69-72. 

[14]  齐华,李佳,刘军.基于Websocket的消息实时推送设计与实现[J].微处理机,2016,37(03):36-39+43.

[15]  陈丽枫,郑力新,王佳斌.基于HTML5 WebSocket的Web实时通信机制的研究与实现[J].微型机与应用,2016,35(10):88-91.

[16]  张艺.基于WebSocket的即时通信系统研究与实现[J].软件,2015,36(03):89-94.

[17]  陆晨,冯向阳,苏厚勤.HTML5 WebSocket握手协议的研究与实现[J].计算机应用与软件,2015,32(01):128-131+178.

[18]  李代立,陈榕.WebSocket在Web实时通信领域的研究[J].电脑知识与技术,2010,6(28):7923-7925+7935.

文章标题:《基于Django的B/S微博系统——后端程序设计与开发》,原文地址:,如有转载请标明出处,谢谢。

上一篇:基于TCP的文件传输系统——文件接收模块的设计与实现


下一篇:基于卷积神经网络改进算法的藏文识别系统的设计与分析


[相关文章]