Django+快速实战入门_第1页
Django+快速实战入门_第2页
Django+快速实战入门_第3页
Django+快速实战入门_第4页
Django+快速实战入门_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Django 快速实战入门作者:Hily原始链接:http:/hily.me/blog/2008/11/learning-django-ch7/版权声明:可以转载,转载时务必以超链接形式标明文章原始出处和作者信息及版权声明(一):概述Django(读作:dgo),它是目前最流行的基于 Python 开发的 Web 开发框架之一。因为 Python 本身不像 PHP 一样是专门为开发 Web 应用而设计的,因此如果不使用框架,开发效率会非常低。而在使用框架后,整个系统的结构和代码的组织会更加清晰明了,并具备一定的可扩展性,同时也利于模块或代码的重用。这样,在开发 Web 应用时不但可以节约大量的

2、开发时间,还可以享受简洁高效的开发带来的乐趣。除了 Django,类似框架的还有TurboGears、web.py等等,本文介绍笔者初次接触的 Python Web 开发框架 Django,并通过建立一个简易的留言板为例来帮助大家快速了解 Django。本文假设您使用 Linux 作为开发环境,并且已经掌握 Linux 的基本操作以及 Python 的基础知识。示例代码中所使用到的 Django 版本为 1.0.1。Django 架构Django 作为一个 Web 开发框架,它包括以下基本组成部分:1. HTTP 请求处理与响应2. URL 映射3. 视图控制4. 模板系统5. 数据库操作模型

3、其中模型是通过 Django 内建的 ORM 机制实现的,而模板系统也依赖于内建的模板引擎。Django 的基本架构如下:在此基本模型基础上,Django 还实现了许多常用且实用的中间件,如负载均衡、缓存和 Session 等。(二):组建开发环境开发系统的选择Django 和 Linux 都是开源运动的优秀产物,使用开源产品,在构建一个应用时,我们会有更多选择,也更加灵活。因此没有任何理由让我选择在 Windows 下开发和部署基于 Django 的应用。笔者使用的 Linux 系统为Gentoo Linux:gentoo # uname -aLinux gentoo 2.6.25-gent

4、oo-r9 #2 SMP Mon Nov 10 13:39:19 CST 2008 i686 AMD Athlon(tm) 64 X2 Dual Core Processor 4000+ AuthenticAMD GNU/Linux安装 PythonDjango 使用 Python 代码编写而成,因此需要先确认你的系统中是否已安装 Python。大多数的 Linux 中都已经预装了 Python,可以使用以下命令查看是否已经安装:gentoo # python -VPython 2.4.4安装 Django从/download/上下载当前的

5、最新官方发布版本:Django-1.0.2-final.tar.gz。然后解压并进行安装:gentoo # tar zxf Django-1.0.2-final.tar.gzgentoo # cd Django-1.0.2-finalgentoo Django-1.0.2-final # python setup.py install接着你可以在 Python 命令窗口中查看当前已安装的 Django 版本:gentoo # pythonPython 2.4.4 (#1, Jun 15 2008, 16:32:23)GCC 4.1.2 (Gentoo 4.1.2 p1.0.2) on linu

6、x2Type help, copyright, credits or license for more information. import django django.VERSION(1, 0, 2, final, 0)安装 MySQLDjango 支持PostgreSQL、SQLite 3和MySQL等多种数据库,其中 MySQL 是我用过的最为满意的数据库。如果您没有其它特殊需求的话,建议您选用 MySQL。在 Gentoo 下的安装指令为:gentoo # emerge mysql安装完 MySQL 后,默认密码为空,需要执行以下指令设置 root 用户的密码:gentoo # my

7、sqladmin -uroot -p -h localhost password hily如果有需要,可以修改 /etc/mysql/f 对 MySQL 进行配置。然后启动 MySQL:gentoo # /etc/init.d/mysql start测试是否安装成功:gentoo # mysql -uroot -pEnter password:Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 194Server version: 5.0.60-log Gentoo Li

8、nux mysql-5.0.60-r1Type help; or h for help. Type c to clear the buffer.mysql安装 MySQLdb要在 Django 中使用 MySQL,你还需要安装 MySQLdb:/projects/mysql-python下载后安装(需要 setuptools 支持):gentoo # tar zxf MySQL-python-1.2.2.tar.gzgentoo # cd MySQL-python-1.2.2gentoo MySQL-python-1.2.2 # python setu

9、p.py install新建一个 Django 项目运行以下命令,新建一个项目:gentoo # django-admin.py startproject myblog运行后会在当前目录下新建一个名为 myblog 的目录,结构如下:gentoo # ls myblog/_init_.py manage.py settings.py urls.py包含四个文件: _init_.py表示该目录是一个包。 manage.pyDjango 项目的管理工具,后文多处会用到这个工具。您可以先使用以下命令查看这个工具的子命令列表:gentoo myblog # python manage.py help在

10、 help 后面加上子命令,则可以查看各个子命令的帮助,如:gentoo myblog # python manage.py help runserverusage: manage.py runserver options optional port number, or ipaddr:portStarts a lightweight Web server for development.options: -settings=SETTINGS The Python path to a settings module, e.g. myproject.settings.main. If this

11、isnt provided, the DJANGO_SETTINGS_MODULE environment variable will be used. -pythonpath=PYTHONPATH A directory to add to the Python path, e.g. /home/djangoprojects/myproject. -traceback Print traceback on exception -noreload Tells Django to NOT use the auto-reloader. -adminmedia=ADMIN_MEDIA_PATH Sp

12、ecifies the directory from which to serve admin media. -version show programs version number and exit -h, -help show this help message and exit settings.py保存项目级别的 Django 配置信息,如数据库配置、时区设置等等。 urls.py定义 Django 的 URL 映射规则,实现 URL Mapper( 或者叫 URL dispatching)。启动开发服务器Django 自带了一个轻量级的 Web 服务器,适合于在开发过程中快速测试

13、Django 代码,而不需要频繁地启动 HTTP 服务器或 FastCGI 服务器。使用以下命令来启动:gentoo myblog # python manage.py runserverValidating models.0 errors foundDjango version 1.0.2 final, using settings myblog.settingsDevelopment server is running at :8000/Quit the server with CONTROL-C.runserver 默认在 :8000 上监

14、听,如果要使用不同的 ip:port,只需要在 runserver 后加上 ip:port 参数,如:gentoo myblog # python manage.py runserver :8080关于该命令的具体帮助,可参考上一节中所述,输入以下命令查看:gentoo myblog # python manage.py help runserver启动成功后,用浏览器打开对应的http:/ip:port/,如:8080/。您应该可以看到以下界面:这就表明我们的开发服务器已经启动,并且正常运行。从下一节起,我们从一个简单的例子开始,逐步引

15、入 Django 框架的各个组成部分,来帮助大家理解 Django 的 MTV 模型的工作机制。主要包括: HTTP 请求/响应 URL 映射 视图控制 模板系统 数据库模型(三):视图控制视图(View),顾名思义,就是用于处理用户端显示的模型。然而,Django 中的视图不仅仅是个视图,还充当着一部分控制器的角色,体现在与数据模型的协同工作过程中。HTTP 请求/响应Django 框架中把 HTTP Request 和 HTTP Response 都封装成了对象,HttpRequest 和 HttpResponse。在每个视图函数中,都会接收到一个 HttpRequest 对象,如:def

16、 index(request): pass有了 request 这个对象的传入,我们可以在视图函数中很方便地读取 HTTP 请求的相关信息。当要返回信息给客户端时,我们可以简单地返回一个 HttpResponse 对象,如:def index(request): return HttpResponse(First Page)视图控制一个视图控制单元就是一个视图函数,上一部分中我们看到的 index 就是一个视图函数。视图在 Django 中承担着一部分控制器的角色,它要处理 HTTP 请求的信息,并将处理结果回应给客户端。因此,如果把视图函数看作一个输入输出模型,那么,视图函数的输入参数中至少

17、应该包含有 HTTP 请求信息,而它的输出是对客户端的 HTTP 响应。URL 映射URL 映射(URL Mapping 或 URL Dispatching),是 Django 框架的入口。所有的 URL 请求都会交由 URL 映射层处理,一个项目的 URL 映射关系定义在项目目录下的文件 urls.py 中。一个简单的例子结合以上讲到的三个部分,我们举一个简单的例子,在页面上显示客户端的 IP 地址,来看看这三个部分是怎样工作的。打开项目目录下的 urls.py,通过观察注释掉的内容,我们很容易发现,URL 映射关系就是定义在 urlpatterns 这个元组中的:from django.c

18、onf.urls.defaults import *# Uncomment the next two lines to enable the admin:# from django.contrib import admin# admin.autodiscover()urlpatterns = patterns(, # Example: # (rmyblog/, include(myblog.foo.urls), # Uncomment the admin/doc line below and add django.contrib.admindocs # to INSTALLED_APPS to

19、 enable admin documentation: # (radmin/doc/, include(django.contrib.admindocs.urls), # Uncomment the next line to enable the admin: # (radmin/(.*), admin.site.root),)在刚新建完项目后,由于 urlpatterns 为空,Django 会将所有的 URL 请求返回上一节所看到的提示信息页面。下面,我们要在 urlpatterns 中新增一条规则,来处理对根路径:8080/的请求:urlpattern

20、s = patterns(, (r$, index),)index 是一个视图函数,定义如下:def index(request): return HttpResponse(clent ip: %s % request.METAREMOTE_ADDR)修改后整个 urls.py 代码为:from django.conf.urls.defaults import *from django.http import HttpResponsedef index(request): return HttpResponse(clent ip: %s % request.METAREMOTE_ADDR)ur

21、lpatterns = patterns(, (r$, index),)为了简便,我把视图函数也写在了 urls.py 中,实际上这样写不利于代码的维护。习惯上,我们把视图函数写在 views.py 中,然后在 urls.py 中导入这些函数。整理之后,urls.py 代码如下:from django.conf.urls.defaults import *from views import *urlpatterns = patterns(, (r$, index),)views.py 代码如下:from django.http import HttpResponsedef index(requ

22、est): return HttpResponse(clent ip: %s % request.METAREMOTE_ADDR)在对根目录进行 HTTP 请求时,整个过程是这样的:1. Django 根据 urls.py 中的 urlpatterns 配置对请求路径进行匹配,找到用于处理这个请求的视图函数 index。2. 执行 index 这个视图函数,通过 HttpRequest 对象 request 读取客户端 IP,最后通过 HttpResponse 直接返回一串 HTML 代码给客户端。(四):模板系统在上一节,我们通过一个简单的示例演示了 Django 视图控制的工作过程。仔细观

23、察我们可以发现,现在的数据和显示是混合在一起的,这样不利于分工和代码维护。Django 的模板系统可以帮助我们解决这个问题。模板引擎其实是个数据渲染引擎,它将数据以一定的结构和样式格式化后输出。实现数据与显示分离下面,我们通过使用 Django 的模板系统将上一节示例中的数据和显示分离:from django.http import HttpResponsefrom django.template import Context, Templatedef index(request): t = Template(client ip: ip ) c = Context(ip: request.ME

24、TAREMOTE_ADDR) html = t.render(c) return HttpResponse(html)乍一看,虽然数据和显示分离了,但似乎还没有原来的简洁,模板和代码混合在一起,而且代码行数增加了。这时你可能想到把模板存储为文件,在渲染时通过文件操作读入模板内容,这样就太繁琐了。Django 已经为我们提供了这样一个简便易用的渲染接口:render_to_response。通过指定模板文件和数据集合,render_to_response 可以轻易将数据格式化并返回一个 HttpResponse 对象。修改以上代码,在 myblog 目录下新建一个专门用于存放模板的目录 temp

25、lates,然后在其中新建 index.html:client ip: ip 然后我们需要修改 settings.py,把 templates 目录的绝对路径加入到 TEMPLATE_DIRS 变量中,告诉 Django 我们的模板所保存的目录:TEMPLATE_DIRS = ( /root/myblog/templates,)大多数情况下我们不喜欢使用绝对路径,因为在代码存放路径改变时又要重新修改设置,因此我们可以使用一种更加灵活的方式:import os.pathTEMPLATE_DIRS = ( os.path.join(os.path.dirname(_file_), template

26、s).replace(, /),)改好后,重新打开页面查看一下效果::8080/。模板系统语法在上面的模板中,我们只使用到一个模板变量 ip ,这还不足以展示出模板系统的强大。除了模板变量,Django 的模板系统还提供了模板标签和模板过滤器这两种机制,通过这些标签和过滤器我们可以轻易的实现条件判断、循环遍历、格式化等各种实用功能。模板标签使用 % 和 % 括起来,如 % if % % else % % endif % 等。Django 内建的大量丰富实用的模板标签,基本上可以满足大部分场合的应用需求。过滤器作用于模板变量,通过在变量名后加上 | 和过滤器名及

27、参数实现,如: birthdate | date: Y-m-d 将输出类似 1985-02-13。在内建的标签或过滤器不足以满足我们的要求的情况下,我们可以自己编码实现自定义的标签和过滤器。此文是帮助大家快速了解和上手 Django,而不是 Django 的中文手册。因此关于这些标签和过滤器的具体用法,请参考官方文档(在本文第一节中有提到)。使用标签和过滤器接下来我们要再修改以上例子,通过输出 request.META 中的所有元素,来演示一下模板标签和模板过滤器的用法。views.py:from django.http import HttpResponsefrom django.short

28、cuts import render_to_responsedef index(request): return render_to_response(index.html, meta: request.META)templates/index.html% for meta_name, meta_value in meta.items % meta_name : meta_value|default:No value % endfor %for 循环将 meta.items 中的项目依次遍历,cycle 用于在 for 循环中不断地切换行的背景颜色,当 meta_value 为空时,通过 de

29、fault 过滤器将显示为“No value”。输出结果类似如下:(五):数据模型ORM 与 CRUD在当今绝大多数的 Web 应用中,数据库已经成为不可或缺的一个重要组成部分。对于许多应用来说,使用传统的开发方法,仍然要编写不少 SQL 语句,让许多开发者感到枯燥乏味。由此,在许多面向对象的开发模型中,引入了对象关系映射(ORM )机制,对关系数据库进行抽象与建模。引入了 ORM 之后,对数据库的操作不再是直接通过 SQL 语句,而是直接操作于数据对象。Django 作为一个优秀的 Web 开发框架,它也实现了 ORM,支持CRUD。在许多应用中,SQL 语句大多数都是比较简单的,因此 CR

30、UD 基本上能满足大多数场合的应用,大大提升了开发效率。下面我们就要使用 Django 的 ORM 机制,建立一个简单的留言板,来领略一下无 SQL 的应用开发。配置数据库在这部分,我们将使用 MySQL 作为留言数据的存储引擎,如果你还没安装 MySQL 和 MySQLdb,请回到第二节进行安装。要在 Django 项目中使用数据库,我们需要修改一下项目目录下的 settings.py,这里以 MySQL 为例,修改以下数据库相关的选项:DATABASE_ENGINE = mysql # postgresql_psycopg2, postgresql, mysql, sqlite3 or o

31、racle.DATABASE_NAME = mydb # Or path to database file if using sqlite3.DATABASE_USER = root # Not used with sqlite3.DATABASE_PASSWORD = hily # Not used with sqlite3.DATABASE_HOST = # Set to empty string for localhost. Not used with sqlite3.DATABASE_PORT = # Set to empty string for default. Not used

32、with sqlite3.(注意,在大多数情况下,直接把 root 作为 Web 应用的数据库用户是不安全的,这里是为了简便才这样做的。)新建 Django 应用在 Django 中,项目为应用提供了运行环境,一个项目中可以包含多个应用,同一个项目下的应用共享着项目的配置信息,如数据库配置、模板路径、时区等信息。一个应用以一个包的形式存在,便于重用和移植。从第一节的 Django 架构图中我们可以看到,数据模型(Model)是存在于应用(Application)之中的,因此要使用数据模型,需要首先建立一个 Django 应用。使用以下命令:python manage.py startapp m

33、essages执行成功后,会在项目目录下新建一个名为 comments 的目录,这就是 comments 应用包的路径,startapp 会对它进行初始化。初始化后包含三个文件:gentoo myblog # ls messages/_init_.py models.py views.py对这三个文件作一下简要说明: _init_.py:同项目目录下的 _init_.py,表示这是一个包。 models.py:模型定义。一会儿我们就需要在这里面定义数据模型。 views.py:该应用的视图控制实现代码。新建的应用在 Django 项目中默认是不启用的,因此我们需要修改 settings.py

34、来启用我们的留言板应用,同时先禁用其它暂时不用的应用:INSTALLED_APPS = (# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,# django.contrib.sites, myblog.messages,)在 INSTALLED_APPS 尾部加上 myblog.messages 即可。新建应用后,models.py 和 views.py 都是空的,下一步我们就要对它们进行填充实现。建立留言板模型我们要实现的留言板由以下部分组成: 留言者 邮箱 主页 留言标题 留言内容 留

35、言时间 留言者 IP根据以上描述,在 models.py 中定义它:from django.db import modelsclass Message(models.Model): name = models.CharField(max_length=30) email = models.EmailField() homepage = models.URLField() title = models.CharField(max_length=200) content = models.CharField(max_length=500) time = models.DateTimeField(a

36、uto_now_add=True) ip = models.CharField(max_length=20)Comment 类继承自 Django 的 models.Model 类,models.CharField、models.DateTimeField 等都是 Django 数据模型中支持的类型,更多可用类型请参考官方手册。安装模型到这里为止,我们还没有对数据库做任何结构定义操作,在开发应用时习惯先建立数据库和表结构的朋友可能会有点儿迷惑,这些数据表什么时候会被创建?在这一步里,我们就要做这个事情,通过安装模型把模型定义同步到数据库。首先使用以下命令验证一下模型的有效性:python ma

37、nage.py validate如果提示“0 errors found”,则表示模型被正确定义,否则请返回修改。在开始安装模型前,你可能需要查看一个安装模型时执行的 SQL 语句,你可以使用以下命令查看:python manage.py sqlall messages执行后结果类似:gentoo myblog # python manage.py sqlall messagesBEGIN;CREATE TABLE messages_message ( id integer AUTO_INCREMENT NOT NULL PRIMARY KEY, name varchar(30) NOT NUL

38、L, email varchar(75) NOT NULL, homepage varchar(200) NOT NULL, title varchar(200) NOT NULL, content varchar(500) NOT NULL, time datetime NOT NULL, ip varchar(20) NOT NULL);COMMIT;确认无误后使用以下命令将模型同步到数据库:python manage.py syncdb这将会在数据库中建立一个 messages_message 表。使用数据模型这一节中,我们暂不打算为留言板创建视图控制,这部分我们将在下一节中实现。但是我

39、们希望先通过一些简单的方法来快速测试一下这个数据模型。下面我们就通过使用 Python 命令行来测试这个数据模型,如果直接通过输入 python 来启动 shell,那么在导入一些 Django 相关的库时会发生错误,因为缺少相关环境变量的设置。所以,我们需要使用以下命令启动 Python 命令行:python manage.py shell导入数据模型并显示所有留言: from messages.models import Message Message.objects.all()因为当前数据表中并没有存在任何留言记录,所以 Message.objects.all() 显示为空。新增留言:

40、m = Message(name=Hily,. email=,. homepage=http:/hily.me/,. title=My first message,. content=This is my first message.,. ip=) m.save() Message.objects.all()要使 Message.objects.all() 输出可阅读的信息,我们需要修改 Message 类,增加 _str_ 方法:from django.db import modelsclass Message(models.Model): na

41、me = models.CharField(max_length=30) email = models.EmailField() homepage = models.URLField() title = models.CharField(max_length=200) content = models.CharField(max_length=500) time = models.DateTimeField(auto_now_add=True) ip = models.CharField(max_length=20) def _str_(self): return Name: %s Email

42、: %s Homepage: %sn Time: %s IP: %sn Title: %snContent: %sn % (, self.email, self.homepage, self.time, self.ip, self.title, self.content);重新启动 shell,查看所有留言记录: from messages.models import Message Message.objects.all()更新记录: m = Message.objects.get(name=Hily) m.content = Is this my first messag

43、e? m.save() Message.objects.all()删除记录: m = Message.objects.get(name=Hily) m.delete() Message.objects.all()Django 的 CRUD 为大家演示到此,更多更丰富的模型操作语句,请参考官方手册。(六):表单模型在与用户的交互过程中,表单发挥了十分重要的作用,多数 Web 应用都带有许多的表单处理。与数据模型类似,如果使用传统的开发方法,那么表单页面的编写和提交结果的验证和处理将成为开发者一大头疼事。因此,Django 中将表单抽象为模型,集表单生成、内容验证为一体。通过视图控制将表单模型、数

44、据模型结合在一起,就可以很容易地实现表单结构的设计、对用户提交数据的验证和数据的保存入库等操作。下面我们继续上一节中的示例,为留言板创建一个表单页面。创建表单模型要利用 Django 的表单模型来创建一个表单页面,就需要先建立一个表单模型。我们在应用目录 messages/ 目录下新建一个表单模型文件 forms.py,专门用于存放各种表单模型:from django import formsclass MessageForm(forms.Form): name = forms.CharField(required=True) email = forms.EmailField(required

45、=True) homepage = forms.URLField(required=False) title = forms.CharField(required=True) content = forms.CharField(required=True)forms.CharField、forms.EmailField 同上一节我们使用的字段类型一样,是 Django 内置的表单类型,更多的类型和参数说明请参考官方手册。required=True 表示这个字段是必须填写的,否则表单验证时将会提示错误。创建留言页的视图控制在视图控制函数中生成一个表单对象,最后交由模板系统格式化显示,同时显示留言

46、记录。修改后的 messages/views.py 内容如下:from django.http import HttpResponseRedirectfrom django.shortcuts import render_to_responsefrom forms import MessageFormfrom models import Messagedef message(request): if request.method = POST: form = MessageForm(request.POST) if form.is_valid(): name = form.cleaned_da

47、taname email = form.cleaned_dataemail homepage = form.cleaned_datahomepage title = form.cleaned_datatitle content = form.cleaned_datacontent ip = request.METAREMOTE_ADDR m = Message(name=name, email=email, homepage=homepage, title=title, content=content, ip=ip) m.save() return HttpResponseRedirect(/

48、message/) else: form = MessageForm() messages = Message.objects.all().order_by(-time) return render_to_response(message.html, form: form, messages: messages)当用户提交留言后,request.method 值为 POST,这时候我们使用 MessageForm(request.POST) 来处理表单内容。如果验证通过,则 form.is_valid() 为 True,这时我们就把提交的内容添加到数据库中,这些提交的内容经过验证后都保存在 f

49、orm.cleaned_data 字典中。最后返回一个 HttpResponseRedirect 对象,作用是重定向到 /message/ 页,防止用户刷新导致重复提交数据。实现页面模板模板 templates/message.html: Leave your message here Messages % for message in messages % % if message.homepage % % else % % endif % ( message.email ) leave a message at message.time from message.ip : message.content % endfor %Leave your message

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论