关闭

Django 之 Views

标签: django框架urlviewsname include
900人阅读 评论(0) 收藏 举报
分类:

Django之细节

如果想在URLconf中加入URL和view,只需增加映射URL模式和view功能的Python tuple即可. 这里演示如何添加view中hello功能.

from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',
    ('^hello/$', hello),
)

1
  • 首先,我们从模块 (在 Python 的 import 语法中, mysite/views.py 转译为 mysite.views ) 中引入了hello 视图。 (这假设mysite/views.py在你的Python搜索路径上。关于搜索路径的解释,请参照下文。

    5


  • 接下来,我们为urlpatterns加上一行: (‘^hello/$’, hello), 这行被称作URLpattern,它是一个Python的元组。元组中第一个元素是模式匹配字符串(正则表达式);第二个元素是那个模式将使用的视图函数。

品味一下 URLpattern的语法

Django在检查URL模式前,移除每一个申请的URL开头的斜杠(/)。 这意味着我们为/hello/写URL模式不用包含斜杠(/)。(刚开始,这样可能看起来不直观,但这样的要求简化了许多工作,如URL模式内嵌,我们将在第八章谈及。)

模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义: 上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。

2

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

6

你大多数的URL模式会以^开始、以$结束,但是拥有复杂匹配的灵活性会更好。

你可能会问:如果有人申请访问/hello(尾部没有斜杠/)会怎样。 因为我们的URL模式要求尾部有一个斜杠(/),那个申请URL将不匹配。 然而,默认地,任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。 (这是受配置文件setting中APPEND_SLASH项控制的)

7

如果你是喜欢所有URL都以’/’结尾的人(Django开发者的偏爱),那么你只需要在每个URL后添加斜杠,并且设置”APPEND_SLASH”为”True”. 如果不喜欢URL以斜杠结尾或者根据每个URL来决定,那么需要设置”APPEND_SLASH”为”False”,并且根据你自己的意愿来添加结尾斜杠/在URL模式后.

正则表达式

正则表达式 (或 regexes ) 是通用的文本模式匹配的方法。 Django URLconfs 允许你 使用任意的正则表达式来做强有力的URL映射,不过通常你实际上可能只需要使用很少的一 部分功能。 这里是一些基本的语法。

3

31
符号 匹配
. (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}匹配一个或两个或三个数字)

有关正则表达式的更多内容,请访问 http://www.djangoproject.com/r/python/re-module/.

Django如何处理请求的

当你通过在浏览器里敲http://127.0.0.1:8000/hello/来访问Hello world消息得时候,当你运行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'

5

相对应的文件是mysite/urls.py



当访问 URL /hello/ 时,Django 根据 ROOT_URLCONF 的设置装载 URLconf 。 然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。当找到这个匹配 的URLpatterns就调用相关联的view函数,并把HttpRequest 对象作为第一个参数。 一个视图功能必须返回一个HttpResponse。 一旦做完,Django将完成剩余的转换Python的对象到一个合适的带有HTTP头和body的Web Response

总结一下:

  1. 进来的请求转入/hello/.

  1. Django通过在ROOT_URLCONF配置来决定根URLconf.

  1. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。

  1. 如果找到匹配,将调用相应的视图函数

  1. 视图函数返回一个HttpResponse

  1. Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出

URLconf技巧

urls.py也是一个python文件,故可以在这个文件中使用python允许的任何语法。
先看之前介绍的例子:
from django.conf.urls import patterns, include, url
from books.views import hello, search_form, search, contact, thanks

urlpatterns = patterns('',
    url(r'^hello/$', hello),
    url(r'^search/$', search),
    url(r'^contact/$', contact),
    url(r'^contact/thanks/$', thanks),
)
每一个路径匹配需要导入相应的模块,所以当app的规范越来越大的时候,第二行的import语句就越长。所以可以采用以下几种方法来必定:
1. 只import到模块就可以了,不用写出函数
from django.conf.urls import patterns, include, url
from books import views
urlpatterns = patterns('',
    url(r'^hello/$', views.hello),
    url(r'^search/$', views.search),
    url(r'^contact/$', views.contact),
    url(r'^contact/thanks/$', views.thanks),
)

2. 使用字符串来代表需要执行的views函数,这里就需要写全路径
from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
    url(r'^hello/$', 'books.views.hello'),
    url(r'^search/$', 'books.views.search'),
    url(r'^contact/$','books.views.contact'),
    url(r'^contact/thanks/$', 'books.views.thanks'),
)

3. 更简单的字符串写法,需要使用到patterns()的第一个参数
from django.conf.urls import patterns, include, url

urlpatterns = patterns('books.views',
    url(r'^hello/$', 'hello'),
    url(r'^search/$', 'search'),
    url(r'^contact/$','contact'),
    url(r'^contact/thanks/$', '    thanks'),
)

 类比:Django提供了干净优雅的 URL 方案,URL配置文件是一个标准的 python 文件,支持动态配置。它的本质就是URL模式与调用的视图函数之间的映射表,最简单的配置文件如下:

(1)传递函数对象方式:在 python 中,函数是一级对象,可以像传递其它变量一样传递它们。使用传递函数对象的方式,还可以对函数对象进行包装
from django.conf.urls.defaults import *
from sailing.manager.views import search

urlaptterns = patterns('',
    url(r'^search$',search),
)

(2)传递字符串方式:如果使用字符串的方式,可以不用 import 相关模块,而且可以使用通用前缀(patterns 函数的第一个参数是一个字符串,表示一个视图函数的通用前缀)

from django.conf.urls.defaults import *

urlaptterns = patterns('sailing.manager.views',
    url(r'^search/$','search'),
)

(3)增加多个 patterns() 对象,然后相加即可:

from django.conf.urls.defaults import *

urlaptterns = patterns('sailing.manager.views',
    url(r'^search/$','search'),
)
urlaptterns += patterns('',
    url(r'^admin/', include(admin.site.urls)),
)

(4)include()函数

include(<module or pattern_list>)

your urlpatterns can “include” other URLconf modules!

通常用于分类处理,使项目中urls高度统一.如:

urlpatterns +=patterns('',
     (r'^blog/',include('myblog.urls')),        #myblog app 中urls
     (r'^manage/',include('manager.urls')),     #manage app 中urls
)

注意:

(1)、include() 的正则表达式并不包含一个 $ (字符串结尾匹配符),但是包含了一个斜杆

(2)、每当Django遇到 include() 时,它将截断匹配的URL,并把剩余的字符串发往包含的URLconf作进一步处理。

如在 myblog.app中urls如下:

# myblog.app 中的urls
urlpatterns =patterns('myblog.views',
     (r'^index/$','index'),     #博客首页                   
)

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:23694次
    • 积分:762
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:6篇
    • 译文:1篇
    • 评论:0条