您的位置:首页 > 编程语言 > Python开发

基于Python Django技术构建web系统实践

2016-03-02 20:12 711 查看
基于Python Django技术构建web系统实践

1 引言

Python语言是一门动态类型开发语言,在数学计算、数学分析、系统运维中有广泛的应用。在web框架开发中,基于Java语言的struts web框架在业界应用较多,struts框架中分层分域进行开发,用户通过jsp提交请求到action控制器,action对应相应的Form接收数据,同时action调用 domain域的form类及相应的服务及数据库的连接操作来实现相应的功能;涉及java、bean、jstl、jsp、tomcat、xml等技术的综合应用。

相比其他web框架开发,Django作为python语言开发的web框架,基于MVC模型,模型(Model)、模板(Template)和视图(Views)。模型(Model)数据存取层,处理数据库相关的事务,数据库模型定义、数据存取、数据库表关系定义等;模板(Template)表现层在用户web页面展示相应的页面。视图(View)业务逻辑层定义业务逻辑的控制,类似于strutsweb框架的action控制器。Django
框架定义了一套adminweb应用,基于Django的现有框架,开发者能快速开发出符合需求的web系统。

作为任务单工作流的应用场景,任务单从填写申请、审核、归档需要一个流程。从任务单的流程需求分析,基于pythonDjango的快速开发能力,通过业务需求模型分析、数据库建模、web开发,从Djangoweb 框架的admin 应用着手,快速开发实现了任务单web系统的原型。

2 开发环境搭建安装

从python、django、mysql的官网中下载安装包,在windows系统中安装python、django、mysql数据库,在命令行语句中输入python,显示python版本号验证安装成功;在python提示符中输入importdjango,验证django安装成功;mysql数据库安装完成以后,登录mysql5.7 command line client查看数据库。

1、 在Django中创建一个新WebManage应用项目。进入python\scripts目录,

以命令行方式创建新应用项目django-admin.pystartproject WebManage,新项目创建以后,在python\scripts目录下自动生成WebManage的子目录,包含__init__.py、manage.py、settings.py、urls.py文件。

2、在Django中WebManage项目中创建应用。进入python\scripts目录, 创建新应用pythonmanage.py startapp WebSource,应用创建以后,自动生成WebSource子目录,包含__init__.py、models.py、tests.py、views.py文件

3、DjangoWebManage项目及应用创建以后,在命令行方式下输入netstart mysql57,启动Mysql数据库。

4、Django 内建有web服务器,切换到WebManage的目录,命令行输入pythonmanage.py runserver 0.0.0.0:8000,在本机8000端口启动web服务,使用网页浏览器http://127.0.0.1:8000/ 可以打开页面 。

系统运行环境:

操作系统:windows系统

数据库:Mysql 5.7

开发工具:eclipse,windowsie

版本管理:sourcetree、git

开发语言:python 2.7.8,javascripte,html

WEB框架:django1.4.5

3 系统建模

系统建模步骤包括对需求进行数据分析,需求分析以后进行数据表结构设计,然后在Django Model模型中定义数据库表。

1.1 3.1系统需求分析

设计一个任务单的web原型系统,分析任务单的工作场景包括以下内容:用户数据(如部门、人员定义)、任务单数据(任务分类、任务单的具体内容)、流程数据(流转部门、进展情况等)

1.2 3.2 数据库表结构设计

根据系统需求分析内容,进行系统的数据库结构设计,分别包括任务表、进展表、分类表、部门表、人员表、状态表等数据库表。数据库各表的序列号在model模型与Mysql数据库同步操作时,由数据库系统自动生成,每增加新的记录自动增加序列号。

数据库表中任务表、进展表涉及人员及部门的字段,定义外键分别对应于人员表及部门表。

数据库表中任务表、进展表通过任务单编号进行关联。

系统使用Django Web框架进行系统开发,Django使用MVC(模型-视图-控制器)软件开发模式。模型定义数据库表及数据库访问,视图定义用户显示、控制器定义系统的请求逻辑。在系统需求分析及数据库表结构设计时,已经梳理清楚系统的数据库表之间的逻辑关系,实现系统的需求需要定义的数据表详细字段内容及字段之间的关联。数据库表逻辑理清楚以后,我们在Django
Model 模型中实施物理定义数据模型,引入from django.db importmodels,分别在Models.py中定义classTaskstatus(models.Model)、class
Supervise(models.Model)、class Depart(models.Model)、class Staff(models.Model)、class Task(models.Model)、classProcess(models.Model)等数据库类,以class
Task(models.Model)为例说明数据库model的定义如下:

class
Task
(models.Model):
meeting_date=models.DateField(verbose_name='会议日期')
task_no= models.CharField(max_length=300,verbose_name='编号')
status=models.ForeignKey(Taskstatus,verbose_name='办结状态')
task= models.TextField(verbose_name='工作任务及要求')
origin= models.CharField(max_length=300,verbose_name='来源')
leader= models.ManyToManyField(Staff,blank=True,verbose_name=u'牵头领导')
depart1=models.ManyToManyField(Depart,related_name='depart1_task',verbose_name=u'主办部门')
depart2=models.ManyToManyField(Depart,related_name='depart2_task',blank=True,verbose_name=u'协办部门')
ufinish_date=models.DateField(verbose_name='预计完成时间')
Supervise=models.ForeignKey(Supervise,verbose_name='分类')
defget_leader(self):
return','.join([ ileader.Staffnamefor
ileader in
self.leader.all()])
get_leader.short_description ='牵头领导'
defget_depart1(self):
return','.join([ idepart1.Departnamefor
idepart1 in
self.depart1.all()])
get_depart1.short_description ='主办部门'
defget_depart2(self):
return','.join([ idepart2.Departnamefor
idepart2 in
self.depart2.all()])
get_depart2.short_description ='协办部门'
classMeta:
verbose_name = '工作任务单'
verbose_name_plural =
'工作任务单'
def__unicode__(self):
return'%s %s %s' % (self.task_no,self.task[:30],'...')

在Django的Model模型定义好的数据库类以后,需要将数据库表同步到Mysql数据库中。

1、进入python shell的命令行交互模式,校验Django与Mysql数据库的连接正常。

pythonmanage.py shell
>>> from django.db importconnection
>>> cursor = connection.cursor()

2、运行python manage.py,对Django Modle模型定义的数据库表进行有效性校验,生成Sql执行脚本语句,同步到Mysql数据库系统中。

python manage.py validate
python manage.py sqlall WebSource
python manage.py syncdb



3、登录Mysql数据库,查看系统的数据库表物理结构显示正常。

show databases

use WebManage

show tables

descripbe WebSource_task;

3 系统设计实现

系统设计实现步骤,用户在web浏览器上打开一个网页,系统会在setting配置文件中查找对应的数据库引擎及应用模块,根据url映射方案转到对应的view视图进行处理,view视图关联model模型与mysql数据库动态交互处理,将处理后的动态数据加载到template模板页面中,返回模板页面显示给用户。

1.5 4.1数据库引擎及应用注册

Django web 系统在装载系统时,先查找应用的settings.py配置文件,在配置文件中配置数据库引擎、系统目录路径、admin应用注册等内容,在web页面浏览系统时,指引系统初始化加载时连接哪个数据库,在什么目录路径进行查找,及系统登记注册的应用程序等内容。

数据库配置引擎为Mysql数据库,定义连接的数据库名称,数据库连接的用户名及密码,定义数据库连接的主机名,如果在本机连接,可以不用填写,远程连接部署数据库,则填写远程数据库的地址,定义数据库连接的端口号,通常情况下,Mysql的数据库端口使用3306端口。

DATABASES = {
'default': {
'ENGINE':'django.db.backends.mysql',
'NAME':'WebManage',
'USER':'root',
'PASSWORD':'WebManage',
'HOST':'',
'PORT':'3306',
}
}

目录路径的配置如下,使用相对路径值转换成绝对路径值:

TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__),'templates').replace('\\','/'),
)
系统登记注册的应用程序,Django
框架系统自身开发了很多应用,admin应用程序具备用户权限管理、功能模块编辑显示等功能,系统利用Django的admin应用的强大工具进行部署开发,在setting.py中注册django.contrib.admin应用,充分使用admin的功能。

INSTALLED_APPS = (
'django.contrib.admin',

1.6 4.2 URL定义

用户在Web浏览器中输入一个网址http://127.0.0.1:8000/admin/,Django web系统在系统的urls.py配置文件查找admin对应的应用视图,Django
admin应用在url.py使用时先需导入admin模块,from django.contrib importadmin,然后进行登记发现
admin.autodiscover()。

在定义url时,需理解正则表达式语言的表达方式,r'^admin/'这里没有限定url admin的输入范围,如果在admin/之后输入其他的一些字符串,web系统仍会自动处理url对应到admin页面进行转换;如果使用r'^admin/$',url表达式会严格限定用户的输入,^上箭头表达式对字符串的头部进行匹配,$美元符号表达式对字符串的尾部进行匹配,只有符合admin/格式输入的url系统才会进行处理,其他不符合url表达方式的url,系统将会提示页面无法打开。

urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
)

1.7 4.3 view视图定义

系统使用Django web框架的admin应用,通过admin应用视图来显示数据,在admin.py文件中注册Taskstatus、Supervise、Depart、Staff、Process、Task等数据模型。系统开发部署ProcessAdmin、TaskAdmin类来定义在web页面中显示的内容。在TaskAdmin中定义list_display项,在任务单页面中显示会议日期、编号、办结状态、工作任务及要求、来源、牵头领导、主办部门、协办部门、预计完成时间、分类等内容;在TaskAdmin中定义list_filter项,标识过滤器过滤的字段,在任务单页面根据状态或内容分类来进行过滤;在TaskAdmin中定义ordering项,在任务单列表中根据任务单编号、会议日期进行排序;在TaskAdmin中定义search_fields项标识搜索的字段,在工作任务单页面中按任务单内容进行搜索;在TaskAdmin中定义filter_horizontal项,在工作任务单中可以显示水平多选列表框,根据部门或人员,从左边的列表框选择一个或多个项移到右边的列表框进行多选。

class
TaskAdmin
(admin.ModelAdmin):
list_display = ('meeting_date','task_no','status','task','origin','get_leader','get_depart1','get_depart2','ufinish_date','Supervise')
list_filter = ('status','Supervise' )
ordering = ('task_no','-meeting_date')
search_fields = ('task',)
filter_horizontal=('leader','depart1','depart2',)

admin.site.register(Taskstatus)
admin.site.register(Supervise)
admin.site.register(Depart)
admin.site.register(Staff)
admin.site.register(Process,ProcessAdmin)
admin.site.register(Task,TaskAdmin)

1.8 4.4 Tempalte 模板定义

系统在admin目录下建立templates子目录,建立app_index.html、base_site.html、base.html、index.html模板文件,Django
web框架在加载web页面时,先加载系统的子模板app_index.html、base_site.html、base.html、index.html,替换覆盖掉admin的相应的模板文件,这样在web显示页面上会根据系统的内容进行显示,页面更直观友好。
如base_site.html模板页面,从admin/base.html扩展,我们可以自定义web网站页面显示标题为效率提升,以及标签项显示,相比于原来admin的显示更友好。

{% extends "admin/base.html" %}
{% load i18n %}
{% block title %}{{ title }} | {% trans '效率提升' %}{%endblock %}
{% block branding %}
<h1 id="site-name">{% trans '' %}</h1>
{% endblock%}
{% block nav-global %}{%
endblock
%}

4 开发调试

在系统的开发过程中,开发中会遇到各种各样的BUG,开发调试是系统开发实现一个重要的环节,借助一些开发调试的工具对于系统实施能起到事半功倍的作用。在系统的开发调试中,常用的开发调试手段如下:1、在视图中自定义写入一个assert
False 来触发调试页面。在web浏览器运行到断言点时,在web页面就提示详细的调试信息,可以看到详细局部变量值和程序语句。2、在Eclipse开发工具调试配置页面中中定义arguments参数为runserver
–noreload,在代码需要进行调试的地方增加断点,进入单步调试模式调试运行,能详细查看运行的每步运行数据,包括变量、表达式的等内容的值,帮助快速定位BUG,实现系统功能。

5 系统实现功能

Django 的框架基于admin的应用功能很强大,在进行了上述的开发配置以后,我们就拥有了任务单web的系统功能,可以定义用户和管理员不同的权限。

用户登录具备的功能如下:

1、系统功能:登录、修改密码

2、工作任务单的相应功能:查询工作任务单、过滤工作任务单、工作任务单分类、排序

工作任务单、增加工作任务单、修改工作任务单、查询进展情况、过滤进展情况、排序进展情况、增加进展情况、修改进展情况

管理员登录具备的功能如下:

1、系统功能:登录、修改密码

2、审核功能:显示用户及管理员最近操作的日志内容

3、工作任务单的管理功能:查询工作任务单、过滤工作任务单、工作任务单分类、

排序工作任务单、增加工作任务单、修改工作任务单、删除工作任务单、查询进展情况

过滤进展情况、排序进展情况、增加进展情况、修改进展情况、删除进展情况

4、用户数据管理功能:增删用户、增删用户组、增删改人员、增删改状态、增删改内容分类、增删改部门

6 结束语

在业务需求开发的应用中,对于各类业务场景,需要开发者综合考虑各种技术,进行技

术选型,Python是一门简洁、强大的语言,在LAMP架构(Linux、Apache、Mysql、Python或perl)中应用广泛,基于Python的Django
web 框架具备快速开发、部署的优势,在自动运维、数据分析中有广阔的前景。

9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: