【VC++开源代码栏目提醒】:网学会员--在 VC++开源代码编辑为广大网友搜集整理了:基于Django快速开发网络留言板应用_一_数据模型的建立和主页的实现 - 计算机教材绩等信息,祝愿广大网友取得需要的信息,参考学习。
2009.2010.1网络留言板和论坛是一种
常用的信息发布类Web应用,用户可以借助这类应用将自己的信息发布到网络上,也能够对其他用户发布的信息作出自己的评论。
因为此类应用在信息发布方面所具有特殊的优势,所以现在很多网站都集成了这类应用,以此来加强用户之间的联系和交流。
通常,这类应用大多采用传统的动态网页语言(比如ASP、
JSP、
PHP等)来进行开发,这就导致了其开发效率非常低下。
为了提高开发效率,就必须利用流行的框架技术来构建此类Web应用。
1Django1.1概述Django是由一家名为世界在线(worldonline)的Web开发团队于2003年秋用Python语言写的一个Web快速开发框架。
该团队主要负责开发和维护包括Ljworld.com、Lawrence.com和Kusports.com在内的几个新闻网站。
这个团队的开发人员经常要在很短的时间内完成网站相关功能的开发,以保证其内容的及时更新。
为此,该团队成员AdrianHolovaty和SimonWillison编写了一个Web框架来提高整个团队的开发效率。
经过两年时间的不断完善和改进,这个框架已经成功地应用于该团队所负责的大多数网站的开发之中。
为了进一步加快这个框架的发展,同时也为了让全世界的Web开发人员都可以利用这个框架进行高效率的Web应用开发,世界在线团队于2005年以
开源的形式公开发布了这个框架,并根据著名的比利时爵士吉他手DjangoReinhardt的名字将它命名为Django。
1.2特点(1)遵循MVC开发模式。
(2)内置进行快速Web开发所需的各种组件。
(3)利用ORM(对象关系映射)机制定义和操纵数据库,使开发人员可以构建出独立于具体数据库引擎的Web应用。
(4)内置后台管理Web应用。
(5)内置WebServer,开发人员无需安装任何WebServer就可以进行各种Web应用的开发和测试。
(6)具有灵活而强大的自定义URL系统。
(7)内置多语种支持,可以方便地构建多国语言的Web应用。
1.3安装Django用Python写成,运行在Python之上。
因此,先要到Python的官网(www.python.org)下载Python2.5版的安装包,将Python安装到Windows中,这里假设安装在C:python2.5文件夹中。
然后到Django的官网(www.djangoproject.com)下载Django0.96版的安装包,将其解压后,在Windows系统的命令提示符下执行其中的setup.pyinstall命基于Django快速开发网络留言板应用(一)———数据模型的建立和主页的实现刘班摘要:使用传统的动态语言进行Web应用开发,其效率非常低下,借助Django框架技术可以高效地构建各种Web应用。
主要介绍了该应用数据模型的建立和主页的实现过程。
关键词:Web快速开发框架;Python;Django;网络留言板;tinymce编者按Django作为Python平台下的一个优秀的快速Web开发框架,自诞生之日起,就一直是广大Web开发人员的手中利器。
在Django的支持下,开发人员可以用最少的
代码、最快的速度、方便高效地进行各种Web应用的开发。
目前,全世界已有很多站点基于Django进行构建。
为了让国内更多的Web开发者能够了解和
学习Django编程,本刊编辑部特邀刘班撰写了本系列讲座。
系列讲座,围绕着一个
网络留言板应用开发的实例,详细讲解基于Django进行快速Web开发的基本原理和实现方法、技巧和经验。
讲坐分5讲内容安排如下:1.数据模型的建立和主页的实现;2.用户注册和登录、登出功能;3.修改和重置用户登录密码功能;4.用户留言相关操作功能;5.用户留言评论和后台管理功能。
72010.1图1Django的MVC开发模式令即可。
如果安装不成功,可以用下面的方法解决:将安装包中的django文件夹及其包含的所有内容解压到C:python2.5Libsite-packages文件夹中,最后将djangobin文件夹中的django-admin.py文件拷贝到Windows
系统所在文件夹(比如C:windows)中即可。
2准备工作2.1建立一个mysite项目基于Django进行Web应用开发,首先要建立一个新项目,方法是:在Windows命令提示符下,将当前路径转换为要建立项目的位置,这里假设是C盘根目录,然后执行命令django-admin.pystartprojectmysite建立一个名为mysite的新项目。
该命令执行后会在C盘生成项目文件夹mysite,并在此文件夹中建立四个文件:_init_.py、manage.py、settings.py以及urls.py。
2.2建立messageboard应用项目建立好后,就可以在Windows命令提示符下,将当前路径转换为C:mysite,然后执行命令manage.pystartappmessageboard在mysite项目中添加一个名为messageboard的新应用。
该命令执行后会在mysite文件夹中生成应用文件夹messageboard,并在此文件夹中建立3个文件:__init__.py、views.py以及models.py。
接着在settings.py中找到变量INSTALLED_APPS,在其中添加要激活的本应用名称mysite.messageboard,修改后的INSTALLED_APPS变量如下所示:INSTALLED_APPSdjango.contrib.authdjango.contrib.contenttypesdjango.contrib.sessionsdjango.contrib.sitesmysite.messageboard2.3数据库设置Django支持包括MySQL、SQLite在内的多种数据库引擎,本应用将采用SQLite3作为后端数据库引擎。
通常,在使用这些数据库之前必须先安装Python下相应数据库引擎的驱动,但由于Python2.5已经内置了对SQLite3的支持,所以只需在settings.py中找到如下数据库配置
代码段:DATABASE_ENGINEDATABASE_NAME然后,将其修改为下面的形式:DATABASE_ENGINEsqlite3导入os模块。
importosDATABASE_NAMEos.path.joinos.path.dirname__file__messageboard/msgdb其中,os.path.dirname__file__函数用于取出settings.py所在文件夹的位置,再用os.path.join函数将该位置和后面指定的‘messageboard/msgdb’字符串连接在一起,实现指定SQLite3数据库文件msgdb具体存放位置的功能。
对于此
代码段后面的变量DATABASE_USER、DATABASE_PASSWORD、DATABASE_HOST以及DATABASE_PORT,在使用网络数据库时才要求设置。
2.4本地化设置Django内置多国语言支持,默认情况下Django使用英文显示本应用的界面。
可以在settings.py中将变量TIME_ZONE和LANGUAGE_CODE的值分别修改为‘CCT’和‘zh-cn’,实现本应用界面的中文化。
3MVC开发模式Django是一种遵循MVC开发模式的框架。
如图1所示,models.py中定义的各种类代表数据模型(Model),和数据库引擎交互,执行数据库数据的存取操作;templates文件夹中的各个模板文件代表视图(View),负责数据内容的显示;urls.py中定义的各种url访问入口和views.py中定义的各种处理函数(称为Django视图函数)代表控制器(Controller),其中的urls.py可以根据用户输入的url请求,调用views.py中相应的函数与数据模型和视图交互,响应用户的请求。
基于Django的Web应用开发活动由于主要集中在models.py、templates文件夹中的各模板文件以及views.py之内,因此Django的开发模式通常也称为MTV开发模式。
4数据模型本应用的数据库中需要3张数据表来存放各种数据信息,82009.2010.1图2本应用的主页这3张数据表分别是:用户信息表、留言信息表以及评论信息表。
在基于Django开发的应用中不是直接使用SQL语句定义和操纵数据表,而是通过在应用的models.py中定义的数据模型来实现与数据表的交互。
因为Django已经提供了用户信息表和评论信息表的数据模型,所以实际上只需要在models.py中定义留言信息表所对应的数据模型即可,如下所示:以utf-8编码保存该文件。
--coding:utf-8--导入建立各种数据模型所需的类。
fromdjango.dbimportmodels导入用户信息表对应的用户数据模型。
fromdjango.contrib.auth.modelsimportUser定义留言信息表数据模型Msg,该数据模型从Model类继承。
classMsgmodels.Model:实例化一个CharField对象,并将其保存到title属性中,该对象对应于留言信息表的title字段,用于存取留言标题。
titlemodels.CharFieldmaxlength30实例化一个TextField对象,并将其保存到content属性中,该对象对应于留言信息表的content字段,用于存取留言内容。
contentmodels.TextField实例化一个ForeignKey对象,并将其保存到user属性中,该对象对应于留言信息表的user_id字段,该字段引用用户信息表id字段的值,是用户信息表的外键,用于存取留言用户的id信息。
usermodels.ForeignKeyUser实例化一个IPAddressField对象,并将其保存到ip属性中,该对象对应于留言信息表的ip字段,用于存取留言者计算机的ip地址信息。
ipmodels.IPAddressField实例化一个DateTimeField对象,并将其保存到datetime属性中,该对象对应于留言信息表的datetime字段,用于存取留言时间。
其中,auto_now_add参数表示在建立一个新的Msg数据模型对象时,自动设置该属性值为当前时间。
datetimemodels.DateTimeFieldauto_now_addTrue实例化一个IntegerField对象,并其保存到clickcount属性中,该对象对应于留言信息表的clickcount字段,用于存取留言的点击次数信息。
clickcountmodels.IntegerFielddefault0定义该数据模型对象的字符串表示,其功能类似于
Java类中定义的toString方法。
def__str__self:return用户s发表的标题为s的留言self.user.usernameself.title在正式生成留言信息表之前,可以查看一下通过Msg数据模型生成该数据表时所执行的SQL语句,方法是:在Windows命令提示符下,将当前路径转换为C:mysite,再执行命令manage.py
sqlallmessageboard,即可看到如下所示的SQL命令:然后就可以继续执行命令manage.pysyncdb,生成msgdb数据库,同时向该数据库添加本应用运行所要用到的一些数据表,其中包括前面提到的3张数据表。
在manage.pysyncdb命令执行过程中会提示建立一个后台管理时要用到的管理员帐号和密码,只需按要求建立即可。
5主页的实现本应用的主页中除包含对大部分功能的调用链接外,还包含了以分页的形式显示的所有用户发表留言的列表,如图2所示。
开发主页的重点是如何以分页的形式显示所有用户发表留言的列表,但由于Django已经提供了处理这类问题的通用视图函数object_list,因此解决该
问题就比较方便了。
首先在urls.py的patterns函数中加入一个主页的url访问入口(url访问入口就是由一个url地址字符串和一个处理该url地址请求的视图函数组成的一个python元组),如下所示:从defaults模块中导入所有对象,其中包括马上要用到的patterns函数,该函数会分析传入其中的每一个url访问入口,92010.1然后返回一个Django能处理的标准格式的url访问入口列表。
fromdjango.conf.urls.defaultsimporturlpatternspatterns当访问http://127.0.0.1:8000时可以执行msg_list_page函数,显示主页。
rmessageboard.views.msg_list_page定义在views.py中的msg_list_page函数,通过对object_list函数的调用实现分页显示所有用户发表留言的列表,其定义如下所示:导入在models.py中定义的所有数据模型。
frommodelsimport导入list_detail模块,该模块中包含了后面要使用的object_list函数和object_detail函数。
fromdjango.views.genericimportlist_detail请将以上这些导入语句放到views.py文件的开头。
变量ITEMS_PER_PAGE中保存对留言对象列表分页后每页能容纳的留言对象数。
ITEMS_PER_PAGE10定义msg_list_page函数。
defmsg_list_pagerequest:调用object_list函数,在浏览器中显示主页。
returnlist_detail.object_listrequest得到所有留言对象,并将这些对象按其ID属性(该属性由Django为数据模型对象自动添加)的降序排序后保存到queryset参数中。
querysetMsg.objects.order_by-id将变量ITEMS_PER_PAGE的值赋给paginate_by参数,实现对queryset参数中的留言对象
列表的分页处理。
paginate_byITEMS_PER_PAGE指定该函数生成主页时,所使用的模板文件名称。
template_name‘msg_list_page.html指定在模板文件中用于表示分页后留言对象列表的模板变量名称,实际的名称是‘msg_list。
template_object_name‘msgobject_list函数在执行过程中要利用templates文件夹(本应用所要使用的模板文件都存放在该文件夹中。
如果没有该文件夹,则要在messageboard文件夹中手工建立一个)中存放的msg_list_page.html模板文件生成主页,该模板文件的内容如下所示:extendsbase.htmlblocktitle留言列表endblockblockcontentDjango留言板includemsg_list.htmlincludepaginator.htmlendblock该模板功能的实现主要借助了base.html、msg_list.html以及paginator.html3个模板的功能。
base.html是可以被其他模板继承的基础模板,其内容如下所示: 102009.2010.1首页发表留言ifuser.is_authenticateduser.username修改密码退出else登录
注册endif后台管理blockheadendblockblockcontentendblock在基础模板中链接了一个层叠样式表文件style.css和tinymce富文本编辑器的一个tiny_mce.js文件。
style.css文件位于site_media文件夹(该文件夹主要用于存放静态文件,如果没有该文件夹,则要在templates文件夹中手工建立一个)中,现在需要向该文件添加如下所示的用于控制
导航条位置和留言列表外观的css
代码:div.navfloat:righttable.msglistborder:3solidblackborder-collapse:collapsetable.msglistthtable.msglisttdborder:2solidblacktinymce的
代码要从其官网(http://tinymce.moxiecode.com/download.php)下载的tiny_mce的安装包和中文语言包中得到。
将其安装包内jscriptstiny_mce文件夹中的所有内容解压到site_media文件夹中,接着将中文语言包中的3个文件夹:themes、plugins、langs也解压到site_media文件夹中,并替换掉相关的文件,这样在网页中就可以使用tinymce进行留言和评论信息的输入了。
由于目前暂时还是使用Django内置的WebServer进行系统的开发测试,而这个WebServer无法自动处理对层叠样式表css、javascript脚本以及图片等这类静态文件的访问,因此要借助Django内置的serve函数来处理对各种静态文件的访问请求。
其实现方法很简单,只需在urls.py的patterns函数中加入一个静态文件的url访问入口即可,如下所示:对url路径/site_media/下的任何静态文件的访问都会由serve函数处理。
r‘site_media/P.‘django.views.static.serve‘document_root:site_media1其中,serve函数接收两个参数:一个是用于获取请求的静态文件名的path参数;另一个是指定实际静态文件存放位置的document_root参数,其值由变量site_media1指定,该变量定义在urlpatterns变量之前,如下所示:importos得到site_media文件夹的实际位置,并保存到site_media1中。
sitemedia1os.path.joinos.path.dirname__file__messageboard/templates/site_mediamsg_list.html模板用于描述分页显示的留言列表,其内容如下所示:主题留言人IP地址留言时间点击数评论数ifmsg_listloadcommentsformsginmsg_listmsg.titlemsg.user.usernamemsg.ipmsg.datetimedate:Y-m-dH:imsg.clickcountget_comment_countformessageboard.msgmsg.idascomment_countcomment_count112010.1endforelse目前还没有留言信息!endif在该模板中由于使用了Django自带评论应用中的自定义标签库,因此就要在settings.py中添加激活该应用的
代码,方法和激活本应用类似,只需在settings.py中找到INSTALLED_APP变量,在其中添加要激活的评论应用名称,修改后的INSTALLED_APPS变量如下所示:INSTALLED_APPSdjango.contrib.authdjango.contrib.contenttypesdjango.contrib.sessionsdjango.contrib.sitesdjango.contrib.commentsmysite.messageboard然后在Windows命令提示符下,将当前路径转换为C:mysite,接着执行命令manage.pysyncdb,在msgdb数据库中加入评论应用运行所必需的一些数据表。
paginator.html模板用于描述出现在留言列表下方的分页链接和跳转表单,其内容如下所示:ifis_paginatedifhas_previousltlt上一页endififhas_next下一页gtgtendif第page页,共pages页nbspnbsp到第页endif为了使本应用能正常访问templates文件夹中的所有模板文件,还需要在settings.py中找到用于指定模板文件夹位置的TEMPLATE_DIRS变量,并将其改为如下形式:TEMPLATE_DIRSos.path.joinos.path.dirname__file__messageboard/templates完成了上面所有
工作后,就可以在Windows命令提示符下,将当前路径转换为C:mysite,并输入命令manage.pyrunserver启动Django内置的WebServer,然后在浏览器的地址栏中通过输入地址http://127.0.0.1:8000来访问主页了。
因为此时还没有发表任何留言,所以主页上只能看到没有留言的提示信息。
至此,本应用的数据模型和主页就全部建立起来了。
收稿日期:2009-10-12作者介绍刘班,男(1978-),汉族,湖北荆州人,
计算机应用技术专业工学硕士,资深网络
程序员,计算机专业教师,主要研究方向:软件工程、分布式计算、Web计算。
多年来一直从事软件工程和分布式计算等方面的教学科研工作,对
软件开发的技术和管理都有其独到的见解,其论文《基于JXTA的P2P应用开发研究》分别得到了湖北省教育厅重点项目D20081405“基于DEEP-SCAN的P2P监控机制研究”、湖北省教育厅重点项目D20081402“基于P2P的网络信任机制研究”、湖北省2008自然科学基金2008CDB342“基于深度扫描的P2P监控机制研究”、湖北省2008自然科学基金2008CDZ003“基于对等的网络信任机制研究”的资助,其个人策划撰写的《DjangoWeb开发技术与实例》一书也正在编辑出版中。
刘班参与过多个大型软件项目的
设计与开发,具有丰富的理论和实践经验,喜爱
开源技术,目前专注于国外优秀
开源框架技术在国内的应用与推广,是
开源运动的积极支持者和参与者。
12