第一份视图(静态视图)
views.py
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world")
urls.py
from django.conf.urls.defaults import *
from mysite.views import hello
urlpatterns = patterns('',
('^hello/$', hello),
)
结果,网页显示:hello world
Django处理请求的流程
当你通过在浏览器里敲http://127.0.0.1:8000/hello/来访问Hello world消息得时候,Django在后台有些什么动作呢?
所有均开始于setting文件。当你运行python manage.py runserver,脚本将在于manage.py同一个目录下查找名为setting.py的文件。这个文件包含了所有有关这个Django项目的配置信息,均大写: TEMPLATE_DIRS, DATABASE_NAME 等. 最重要的设置时ROOT_URLCONF,它将作为URLconf告诉Django在这个站点中那些Python的模块将被用到还记得什么时候django-admin.py startproject创建文件settings.py和urls.py吗?自动创建的settings.py包含一个ROOT_URLCONF配置用来指向自动产生的urls.py. 打开文件settings.py你将看到如下:
ROOT_URLCONF = 'mysite.urls'
相对应的文件是mysite/urls.py当访问 URL /hello/ 时,Django 根据 ROOT_URLCONF 的设置装载URLconf 。 然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。当找到这个匹配 的URLpatterns就调用相关联的view函数,并把HttpRequest 对象作为第一个参数。 (稍后再给出 HttpRequest 的更多信息) (我们将在后面看到HttpRequest的标准)正如我们在第一个视图例子里面看到的,一个视图功能必须返回一个HttpResponse。 一旦做完,Django将完成剩余的转换Python的对象到一个合适的带有HTTP头和body的Web Response,(例如,网页内容)。
总结一下:
- 进来的请求转入/hello/.
- Django通过在ROOT_URLCONF配置来决定根URLconf.
- Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
- 如果找到匹配,将调用相应的视图函数
- 视图函数返回一个HttpResponse
- Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
第二份视图(动态视图)
views.py
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
urls.py
urlpatterns = patterns('',
('^time/$', current_datetime),
)
结果,网页显示:当前时间
第三份视图(动态URL)
urls.py
urlpatterns = patterns('',
# ...
(r'^time/plus/\d+/$', hours_ahead), #一位或多位组成的数字
(r'^time/plus/\d{1,2}/$', hours_ahead), #一位或者二位组成的数字
(r'^time/plus/(\d{1,2})/$', hours_ahead), #这里加了括号(),我们需要一个方法把它传递到视图函数里去,这样 我们只用一个视图函数就可以处理所有的时间段了。
#我们使用圆括号把参数在URL模式里标识 出来。 在这个例子中,我们想要把这些数字作为参数,用圆括号把 \d{1,2} 包围起来
# ...
)
#这里我们采用最后一个url模式
views.py
from django.http import Http404, HttpResponse
import datetime
def hours_ahead(request, offset): #这里多了一个参数,就是上面括号的功能,捕获的值永远都是string类型
try:
offset = int(offset)
except ValueError:
raise Http404()
dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
return HttpResponse(html)
归纳:
了解urls.py views.py两个文件的调用关系(第一个视图);
views.py的动态内容返回(第二个视图);
urls模式里,动态的传递参数给views里的函数(第三个视图)。
后续学习掌握方向:
1.了解掌握urls.py高级内容
2.掌握python正则表达式