Django学习笔记(2):Django视图和URL

时间:2022-09-26 19:16:02

一、简单的小demo来描述django处理流程

1.建立视图(view)

首先在当前目录中新建一个views.py(视图),然后编辑如下:(其实在后面教程中,这只是我们手动建立的,我们完全可以建立一个app,其中就包含它)(我们也可以先建立url映射,在建立对应的视图函数)

Django学习笔记(2):Django视图和URL
 1 #coding=utf-8
2
3 #从django.http模块中导入HttpResponse类[1]
4 from django.http import HttpResponse
5 import datetime
6
7 def current_datetime(request): #[2]
8 now=datetime.datetime.now()
9 html="<html><body>现在时刻:%s.</body></html>" %now
10 return HttpResponse(html)
Django学习笔记(2):Django视图和URL

注意:这是一段很简单、简陋的例子,具体优化见后面介绍
分析:

[1].HttpResponse类位于django.http模块中,是自己手动创建,与Django自动创建的HttpRequest对象不同,在每一个视图(views)都需要实例化、处理、返回一个HttpResponse对象。

一般情况下,创建一个HttpResponse时,以字符串的形式传递页面内容给HttpResponse构造函数:

1 >>>response=HttpResponse('I am BeginMan! ')
2 >>>response=HttpResponse('HelloWorld',mimetype='text/plain')

如果希望增加内容,则可以把response当做一个类文件对象来使用:

1 response=HttpResponse()
2 response.write("<p>i am beginman </p>")
3 response.write("<p>coding for fun! </p>")

其他具体信息见《Django Book》附录内容

[2].在这个(views.py)视图中每一个函数称作视图函数,视图函数都以一个HttpRequest对象为第一个参数,该参数通常命名为request

2.URL映射视图

url就像一座桥梁,通过这个桥梁我们才找到视图中对应的代码,渲染的模板(这一章暂时没有将到模板),而这一切都通过一个叫URLConf(即urls.py)的东东,在我们django-admin.py startproject mysite后,该脚本会自动建立一份URLConf(即urls.py文件),我们可以在settings.py中找到它的真身,如下:

1 。。。。。。
2 ROOT_URLCONF = 'mysite.urls'
3 。。。。。。省略

urls.py打开如下:

Django学习笔记(2):Django视图和URL
 1 from django.conf.urls.defaults import *  #[1]
2
3 # Uncomment the next two lines to enable the admin:
4 # from django.contrib import admin
5 # admin.autodiscover()
6
7 urlpatterns = patterns('',         #[2]
8 # Example:
9 # (r'^mysite/', include('mysite.foo.urls')),
10
11 # Uncomment the admin/doc line below to enable admin documentation:
12 # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
13
14 # Uncomment the next line to enable the admin:
15 # (r'^admin/', include(admin.site.urls)),
16 )
Django学习笔记(2):Django视图和URL

分析:
[1].从django.conf.urls.defaults导入所有对象,其中包括了一个叫做patterns的函数
[2].patterns()函数将处理结果保存到urlpatterns变量中,注意patterns(' ',)有块空白,它的存在就是之前的在浏览器显示的it worked 的作用。

具体URL配置见另一篇博文:"URL常用配置"

我们编辑该文件以展示current_datetime视图:

Django学习笔记(2):Django视图和URL
1 from django.conf.urls.defaults import *
2 from mysite.views import current_datetime
3
4 urlpatterns = patterns('',
5 (r'^time/$',current_datetime)
6 )
Django学习笔记(2):Django视图和URL

patterns函数中的参数其实就是一个元祖,前边是一个正则表达式的,后边是对应的视图函数,(在本demo中)在浏览器中通过输入http://127.0.0.1:8000/time ,Django在URLconf中的所有URL模式中,查找第一个匹配/time/的条目。如果匹配成功,则视图函数返回一个HttpResponse,调用current_datetime这个视图函数,Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来,(在没有模板定义的情况下)显示输出结果。

至此这一系列Django简单的处理流程就完成了。

二、Django处理请求的工作机制

记住:

1.用manage.py runserver 启动Django服务器时就载入了在同一目录下的settings.py。该文件包含了项目中的配置信息,如前面将的URLConf等,其中最重要的配置就是ROOT_URLCONF,它告诉Django哪个Python模块应该用作本站的URLConf,默认的是urls.py

2.当访问url的时候,Django会根据ROOT_URLCONF的设置来装载URLConf。

3.然后按顺序逐个匹配URLConf里的URLpatterns。如果找到则会调用相关联的视图函数,并把HttpRequest对象作为第一个参数(通常是request)

4.最后该view函数负责返回一个HttpResponse对象,

Django学习笔记(2):Django视图和URL

四、深入一步:动态URL

上面一个简单的例子介绍了动态的内容,接下来深入一下url的映射,实现动态的url。

我们要做到就是在url后输入一些参数,从而实现不同的调用内容(如在url后输入数字(小时)来显示当前时间累加后的时间,如当前时间是6:20,在浏览器中输入....time/plus/3,则显示9:20)的小实例(可参见《Django Book》)

我们可以有三种不同的方法来实现:

第一种:全部写入到url中

Django学习笔记(2):Django视图和URL
1 urlpatterns = patterns('',
2 (r'^time/$',current_datetime),
3 (r'^time/plus/1/$',one_hour_ahead),
4 (r'^time/plus/2/$',two_hour_ahead),
5 (r'^time/plus/3/$',three_hour_ahead),
6 ...............................
7 ..................
8 )
Django学习笔记(2):Django视图和URL

这种不解释,累死写不完。pass

第二种:URL查询字符串的形式,以?来实现,如/time/plus?hours=3。这一种在asp.net中常见的一种方式,但是在django中,它会显得臃肿、低效。pass

第三种:带通配符的URL匹配模式
因为URL模式是一个正则表达式,因此,可以使用正则表达式的技巧和URL配置技巧来实现。具体见另两篇博文:Python零碎知识(5):有关正则表达式Django总结(1):URL常用配置方法

对于本实例,可以使用 \d+ 来匹配一个或多个数字:

Django学习笔记(2):Django视图和URL
1 urlpatterns = patterns('',
2 (r'^time/$',current_datetime),
3 (r'^time/plus/\d+/$',hours_ahead),
4 (r'^time/plus/(\d{1,2})/$',hours_ahead),#或者限制最大允许99
5 )
Django学习笔记(2):Django视图和URL

然后我们在编写hours_ahead视图函数,整理如下:

Django学习笔记(2):Django视图和URL
 1 #coding=utf-8
2
3 #从django.http模块中导入HttpResponse类[1]
4 from django.http import HttpResponse
5 import datetime
6
7 def current_datetime(request): #[2]
8 now=datetime.datetime.now()
9 html="<html><body>现在时刻:%s.</body></html>" %now
10 return HttpResponse(html)
11
12 def hours_ahead(request,offset):
13 offset=int(offset)
14 dt=datetime.datetime.now()+datetime.timedelta(hours=offset)
15 html="<html><body>In %s hours it will be %s.</body></html>" %(offset,dt)
16 return HttpResponse(html)
Django学习笔记(2):Django视图和URL

注意:hours_ahead有两个参数,第一个request,之前已经讨论过;第二个参数offset是从匹配的URL里提取出来的,如/time/plus/10,则提取offset是10(注意字符串要int成整数才能相加)

五、小结

主要掌握了:1.url映射基础、2.视图函数、3.Django处理请求的工作机制、4.动态URL思想