当前位置:编程学习 > 网站相关 >>

Django学习总结之三-视图和url配置

一、创建视图

1、在mysite文件夹下新建一个文件命名为views.py ,内容为:


[python] 
from django.http import HttpResponse 
 
def hello(request) 
    return HttpResponse("Hello World") 

from django.http import HttpResponse

def hello(request)
 return HttpResponse("Hello World")每个视图函数至少有一个参数,通常叫作request。

2、修改urls.py文件,添加views.py 中视图函数与url的映射。


[python]
from django.conf.urls.defaults import patterns, include, url 
from mysite.views import hello 
 
urlpatterns = patterns('', 
    ('^hello/$', hello), 

from django.conf.urls.defaults import patterns, include, url
from mysite.views import hello

urlpatterns = patterns('',
 ('^hello/$', hello),
)添加该视图函数hello的引用:from django.views import hello;添加url与视图函数的映射:('^hello/$', hello),这是一个元组,第一部分是一个正则表达式,指明url地址,第二个对应的是视图函数名称。其中,上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。


如果我们用尾部不是$的模式’^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/foo 和/hello/bar,而不仅仅是/hello/。类似地,如果我们忽略了尖号(^),’hello/$’,那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。如果我们简单使用hello/,即没有^开头和$结尾,那么任何包含hello/的URL将会匹配,如:/foo/hello/bar。因此,我们使用这两个符号以确保只有/hello/匹配,不多也不少。

3、测试

运行服务器:python manange.py runserver

 

二、正则表达式

符号 匹配
. (dot) 任意单一字符
\d 任意一位数字
[A-Z] A 到 Z中任意一个字符(大写)
[a-z] a 到 z中任意一个字符(小写)
[A-Za-z] a 到 z中任意一个字符(不区分大小写)
+ 匹配一个或更多 (例如, \d+ 匹配一个或 多个数字字符)
[^/]+ 一个或多个不为‘/’的字符
? 零个或一个之前的表达式(例如:\d? 匹配零个或一个数字)
* 匹配0个或更多 (例如, \d* 匹配0个 或更多数字字符)
{1,3} 介于一个和三个(包含)之前的表达式(例如,\d{1,3}匹配一个或两个或三个数字)


django处理请求的过程:

在用django-admin.py startproject mysite 创建工程时,自动在配置文件setings.py 文件中的ROOT_URLCONF赋值为:

ROOT_URLCONF = 'mysite.urls'


它将作为URLconf告诉Django在这个站点中那些Python的模块将被用到。

1、访问URL/hello/时,django根据setings.py 中的ROOT_URLCONF的设置装载URLconf。

2、逐个匹配URLpatterns。

3、匹配成功,则调用相应的视图函数,视图函数返回一个HttpResponse

4、django转换HttpResponse为合适的HTTP response,以web page展现出来。

三、动态内容

动态显示当前时间,views.py 的内容


[python] 
from django.http import HttpResponse 
import datetime 
 
def hello(request): 
    return HttpResponse("Hello world") 
 
def current_datetime(request): 
    now = datetime.datetime.now() 
    html = "<html><body>It is now %s.</body></html>" % now 
    return HttpResponse(html) 

from django.http import HttpResponse
import datetime

def hello(request):
    return HttpResponse("Hello world")

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
urls.py 内容:


[python] 
from django.conf.urls.defaults import patterns, include, url 
from mysite.views import hello,current_datetime 
 
urlpatterns = patterns('', 
    ('^hello/$', hello), 
    ('^datetime/$', current_datetime), 

from django.conf.urls.defaults import patterns, include, url
from mysite.views import hello,current_datetime

urlpatterns = patterns('',
 ('^hello/$', hello),
 ('^datetime/$', current_datetime),
)四、动态url

方法:使用通配符

例子:计算时间差:

urls.py 中添加


[python] 
(r'^time/plus/(\d{1,2})/$', current_datetime), 

(r'^time/plus/(\d{1,2})/$', current_datetime),
\d表示的数字,{1,2}限制在两位数以内,即0~99

r,表示不需要处理里面的反斜杠。

想把这些数字作为参数传递到视图函数中,需要用圆括号把他们括起来。

视图函数:


[python] 
def hours_ahead(request, offset): 
    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) 

def hours_ahead(request, offset):
 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)我们把从url捕获到的offset转换成int类型的原因是:因为url捕获到的参数永远都是string类型。

可以在程序中添加:assert False 触发出错页,通过查看Local vars查看局部变量,这是一种调试方式。

 

补充:Web开发 , Python ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,