Django+快速实战入门.docx
《Django+快速实战入门.docx》由会员分享,可在线阅读,更多相关《Django+快速实战入门.docx(35页珍藏版)》请在冰点文库上搜索。
Django+快速实战入门
Django快速实战入门
作者:
Hily 原始链接:
http:
//hily.me/blog/2008/11/learning-django-ch7/
版权声明:
可以转载,转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
(一):
概述
Django (读作:
['dʒæŋgoː]),它是目前最流行的基于Python开发的Web开发框架之一。
因为Python本身不像PHP一样是专门为开发Web应用而设计的,因此如果不使用框架,开发效率会非常低。
而在使用框架后,整个系统的结构和代码的组织会更加清晰明了,并具备一定的可扩展性,同时也利于模块或代码的重用。
这样,在开发Web应用时不但可以节约大量的开发时间,还可以享受简洁高效的开发带来的乐趣。
除了Django,类似框架的还有 TurboGears、web.py 等等,本文介绍笔者初次接触的PythonWeb开发框架Django,并通过建立一个简易的留言板为例来帮助大家快速了解Django。
本文假设您使用Linux作为开发环境,并且已经掌握Linux的基本操作以及Python的基础知识。
示例代码中所使用到的Django版本为1.0.1。
Django架构
Django作为一个Web开发框架,它包括以下基本组成部分:
1.HTTP请求处理与响应
2.URL映射
3.视图控制
4.模板系统
5.数据库操作模型
其中模型是通过Django内建的ORM机制实现的,而模板系统也依赖于内建的模板引擎。
Django的基本架构如下:
在此基本模型基础上,Django还实现了许多常用且实用的中间件,如负载均衡、缓存和Session等。
(二):
组建开发环境
开发系统的选择
Django和Linux都是开源运动的优秀产物,使用开源产品,在构建一个应用时,我们会有更多选择,也更加灵活。
因此没有任何理由让我选择在Windows下开发和部署基于Django的应用。
笔者使用的Linux系统为 GentooLinux:
gentoo~#uname-a
Linuxgentoo2.6.25-gentoo-r9#2SMPMonNov1013:
39:
19CST2008i686AMDAthlon(tm)64X2DualCoreProcessor4000+AuthenticAMDGNU/Linux
安装Python
Django使用Python代码编写而成,因此需要先确认你的系统中是否已安装Python。
大多数的Linux中都已经预装了Python,可以使用以下命令查看是否已经安装:
gentoo~#python-V
Python2.4.4
安装Django
从 上下载当前的最新官方发布版本:
Django-1.0.2-final.tar.gz。
然后解压并进行安装:
gentoo~#tarzxfDjango-1.0.2-final.tar.gz
gentoo~#cdDjango-1.0.2-final
gentooDjango-1.0.2-final#pythonsetup.pyinstall
接着你可以在Python命令窗口中查看当前已安装的Django版本:
gentoo~#python
Python2.4.4(#1,Jun152008,16:
32:
23)
[GCC4.1.2(Gentoo4.1.2p1.0.2)]onlinux2
Type"help","copyright","credits"or"license"formoreinformation.
>>>importdjango
>>>django.VERSION
(1,0,2,'final',0)
>>>
安装MySQL
Django支持 PostgreSQL、SQLite3 和 MySQL 等多种数据库,其中MySQL是我用过的最为满意的数据库。
如果您没有其它特殊需求的话,建议您选用MySQL。
在Gentoo下的安装指令为:
gentoo~#emergemysql
安装完MySQL后,默认密码为空,需要执行以下指令设置root用户的密码:
gentoo~#mysqladmin-uroot-p-hlocalhostpasswordhily
如果有需要,可以修改/etc/mysql/f对MySQL进行配置。
然后启动MySQL:
gentoo~#/etc/init.d/mysqlstart
测试是否安装成功:
gentoo~#mysql-uroot-p
Enterpassword:
WelcometotheMySQLmonitor. Commandsendwith;or\g.
YourMySQLconnectionidis194
Serverversion:
5.0.60-logGentooLinuxmysql-5.0.60-r1
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>
安装MySQLdb
要在Django中使用MySQL,你还需要安装MySQLdb:
下载后安装(需要setuptools支持):
gentoo~#tarzxfMySQL-python-1.2.2.tar.gz
gentoo~#cdMySQL-python-1.2.2
gentooMySQL-python-1.2.2#pythonsetup.pyinstall
新建一个Django项目
运行以下命令,新建一个项目:
gentoo~#django-admin.pystartprojectmyblog
运行后会在当前目录下新建一个名为myblog的目录,结构如下:
gentoo~#lsmyblog/
__init__.py manage.py settings.py urls.py
包含四个文件:
▪__init__.py
表示该目录是一个包。
▪manage.py
Django项目的管理工具,后文多处会用到这个工具。
您可以先使用以下命令查看这个工具的子命令列表:
gentoomyblog#pythonmanage.pyhelp
在help后面加上子命令,则可以查看各个子命令的帮助,如:
gentoomyblog#pythonmanage.pyhelprunserver
usage:
manage.pyrunserver[options][optionalportnumber,oripaddr:
port]
StartsalightweightWebserverfordevelopment.
options:
--settings=SETTINGS ThePythonpathtoasettingsmodule,e.g.
"myproject.settings.main".Ifthisisn'tprovided,the
DJANGO_SETTINGS_MODULEenvironmentvariablewillbe
used.
--pythonpath=PYTHONPATH
AdirectorytoaddtothePythonpath,e.g.
"/home/djangoprojects/myproject".
--traceback Printtracebackonexception
--noreload TellsDjangotoNOTusetheauto-reloader.
--adminmedia=ADMIN_MEDIA_PATH
Specifiesthedirectoryfromwhichtoserveadmin
media.
--version showprogram'sversionnumberandexit
-h,--help showthishelpmessageandexit
▪settings.py
保存项目级别的Django配置信息,如数据库配置、时区设置等等。
▪urls.py
定义Django的URL映射规则,实现URLMapper(或者叫URLdispatching)。
启动开发服务器
Django自带了一个轻量级的Web服务器,适合于在开发过程中快速测试Django代码,而不需要频繁地启动HTTP服务器或FastCGI服务器。
使用以下命令来启动:
gentoomyblog#pythonmanage.pyrunserver
Validatingmodels...
0errorsfound
Djangoversion1.0.2final,usingsettings'myblog.settings'
Developmentserverisrunningathttp:
//127.0.0.1:
8000/
QuittheserverwithCONTROL-C.
runserver默认在127.0.0.1:
8000上监听,如果要使用不同的ip:
port,只需要在runserver后加上ip:
port参数,如:
gentoomyblog#pythonmanage.pyrunserver192.168.1.6:
8080
关于该命令的具体帮助,可参考上一节中所述,输入以下命令查看:
gentoomyblog#pythonmanage.pyhelprunserver
启动成功后,用浏览器打开对应的 http:
//ip:
port/,如 http:
//192.168.1.6:
8080/。
您应该可以看到以下界面:
这就表明我们的开发服务器已经启动,并且正常运行。
从下一节起,我们从一个简单的例子开始,逐步引入Django框架的各个组成部分,来帮助大家理解Django的MTV模型的工作机制。
主要包括:
▪HTTP请求/响应
▪URL映射
▪视图控制
▪模板系统
▪数据库模型
(三):
视图控制
视图(View),顾名思义,就是用于处理用户端显示的模型。
然而,Django中的视图不仅仅是个视图,还充当着一部分控制器的角色,体现在与数据模型的协同工作过程中。
HTTP请求/响应
Django框架中把HTTPRequest和HTTPResponse都封装成了对象,HttpRequest和HttpResponse。
在每个视图函数中,都会接收到一个HttpRequest对象,如:
defindex(request):
pass
有了request这个对象的传入,我们可以在视图函数中很方便地读取HTTP请求的相关信息。
当要返回信息给客户端时,我们可以简单地返回一个HttpResponse对象,如:
defindex(request):
returnHttpResponse('
FirstPage')
视图控制
一个视图控制单元就是一个视图函数,上一部分中我们看到的index就是一个视图函数。
视图在Django中承担着一部分控制器的角色,它要处理HTTP请求的信息,并将处理结果回应给客户端。
因此,如果把视图函数看作一个输入输出模型,那么,视图函数的输入参数中至少应该包含有HTTP请求信息,而它的输出是对客户端的HTTP响应。
URL映射
URL映射(URLMapping或URLDispatching),是Django框架的入口。
所有的URL请求都会交由URL映射层处理,一个项目的URL映射关系定义在项目目录下的文件urls.py中。
一个简单的例子
结合以上讲到的三个部分,我们举一个简单的例子,在页面上显示客户端的IP地址,来看看这三个部分是怎样工作的。
打开项目目录下的urls.py,通过观察注释掉的内容,我们很容易发现,URL映射关系就是定义在urlpatterns这个元组中的:
fromdjango.conf.urls.defaultsimport*
#Uncommentthenexttwolinestoenabletheadmin:
#fromdjango.contribimportadmin
#admin.autodiscover()
urlpatterns=patterns('',
#Example:
#(r'^myblog/',include('myblog.foo.urls')),
#Uncommenttheadmin/doclinebelowandadd'django.contrib.admindocs'
#toINSTALLED_APPStoenableadmindocumentation:
#(r'^admin/doc/',include('django.contrib.admindocs.urls')),
#Uncommentthenextlinetoenabletheadmin:
#(r'^admin/(.*)',admin.site.root),
)
在刚新建完项目后,由于urlpatterns为空,Django会将所有的URL请求返回上一节所看到的提示信息页面。
下面,我们要在urlpatterns中新增一条规则,来处理对根路径http:
//192.168.1.6:
8080/ 的请求:
urlpatterns=patterns('',
(r'^$',index),
)
index是一个视图函数,定义如下:
defindex(request):
returnHttpResponse('
clentip:
%s'%request.META
['REMOTE_ADDR'])
修改后整个urls.py代码为:
fromdjango.conf.urls.defaultsimport*
fromdjango.httpimportHttpResponse
defindex(request):
returnHttpResponse('
clentip:
%s'%request.META
['REMOTE_ADDR'])
urlpatterns=patterns('',
(r'^$',index),
)
为了简便,我把视图函数也写在了urls.py中,实际上这样写不利于代码的维护。
习惯上,我们把视图函数写在views.py中,然后在urls.py中导入这些函数。
整理之后,urls.py代码如下:
fromdjango.conf.urls.defaultsimport*
fromviewsimport*
urlpatterns=patterns('',
(r'^$',index),
)
views.py代码如下:
fromdjango.httpimportHttpResponse
defindex(request):
returnHttpResponse('
clentip:
%s'%request.META
['REMOTE_ADDR'])
在对根目录进行HTTP请求时,整个过程是这样的:
1.Django根据urls.py中的urlpatterns配置对请求路径进行匹配,找到用于处理这个请求的视图函数index。
2.执行index这个视图函数,通过HttpRequest对象request读取客户端IP,最后通过HttpResponse直接返回一串HTML代码给客户端。
(四):
模板系统
在上一节,我们通过一个简单的示例演示了Django视图控制的工作过程。
仔细观察我们可以发现,现在的数据和显示是混合在一起的,这样不利于分工和代码维护。
Django的模板系统可以帮助我们解决这个问题。
模板引擎其实是个数据渲染引擎,它将数据以一定的结构和样式格式化后输出。
实现数据与显示分离
下面,我们通过使用Django的模板系统将上一节示例中的数据和显示分离:
fromdjango.httpimportHttpResponse
fromdjango.templateimportContext,Template
defindex(request):
t=Template('
clientip:
{{ip}}')
c=Context({'ip':
request.META['REMOTE_ADDR']})
html=t.render(c)
returnHttpResponse(html)
乍一看,虽然数据和显示分离了,但似乎还没有原来的简洁,模板和代码混合在一起,而且代码行数增加了。
这时你可能想到把模板存储为文件,在渲染时通过文件操作读入模板内容,这样就太繁琐了。
Django已经为我们提供了这样一个简便易用的渲染接口:
render_to_response。
通过指定模板文件和数据集合,render_to_response可以轻易将数据格式化并返回一个HttpResponse对象。
修改以上代码,在myblog目录下新建一个专门用于存放模板的目录templates,然后在其中新建index.html:
clientip:
{{ip}}
然后我们需要修改settings.py,把templates目录的绝对路径加入到TEMPLATE_DIRS变量中,告诉Django我们的模板所保存的目录:
TEMPLATE_DIRS=(
'/root/myblog/templates',
)
大多数情况下我们不喜欢使用绝对路径,因为在代码存放路径改变时又要重新修改设置,因此我们可以使用一种更加灵活的方式:
importos.path
TEMPLATE_DIRS=(
os.path.join(os.path.dirname(__file__),'templates').replace('\\','/'),
)
改好后,重新打开页面查看一下效果:
http:
//192.168.1.6:
8080/。
模板系统语法
在上面的模板中,我们只使用到一个模板变量{{ip}},这还不足以展示出模板系统的强大。
除了模板变量,Django的模板系统还提供了模板标签和模板过滤器这两种机制,通过这些标签和过滤器我们可以轻易的实现条件判断、循环遍历、格式化等各种实用功能。
模板标签使用{%和%}括起来,如{%if%}{%else%}{%endif%}等。
Django内建的大量丰富实用的模板标签,基本上可以满足大部分场合的应用需求。
过滤器作用于模板变量,通过在变量名后加上|和过滤器名及参数实现,如:
{{birthdate|date:
"Y-m-d"}}将输出类似1985-02-13。
在内建的标签或过滤器不足以满足我们的要求的情况下,我们可以自己编码实现自定义的标签和过滤器。
此文是帮助大家快速了解和上手Django,而不是Django的中文手册。
因此关于这些标签和过滤器的具体用法,请参考官方文档(在本文第一节中有提到)。
使用标签和过滤器
接下来我们要再修改以上例子,通过输出request.META中的所有元素,来演示一下模板标签和模板过滤器的用法。
views.py:
fromdjango.httpimportHttpResponse
fromdjango.shortcutsimportrender_to_response
defindex(request):
returnrender_to_response('index.html',{'meta':
request.META})
templates/index.html
{%formeta_name,meta_valueinmeta.items%}
{%cycle'#ddd''#ccc'%}">
{{meta_name}}:
{{meta_value|default:
"Novalue"}}
{%endfor%}
for循环将meta.items中的项目依次遍历,cycle用于在for循环中不断地切换行的背景颜色,当meta_value为空时,通过default过滤器将显示为“Novalue”。
输出结果类似如下:
(五):
数据模型
ORM与CRUD
在当今绝大多数的Web应用中,数据库已经成为不可或缺的一个重要组成部分。
对于许多应用来说,使用传统的开发方法,仍然要编写不少SQL语句,让许多开发者感到枯燥乏味。
由此,在许多面向对象的开发模型中,引入了对象关系映射(ORM)机制,对关系数据库进行抽象与建模。
引入了ORM之后,对数据库的操作不再是直接通过SQL语句,而是直接操作于数据对象。
D