DJango — URL的Reverse和Resolve

DJango系列的上一篇我们讲到了它是怎么解析和匹配URL的,并从URL中提取一些有用的信息(曾以year和month为例);但是,URL的管理仍然是一个巨大的工程,我们不得不维护数量庞大的pattern,即使有正则表达式的支持。另一方面,URL数量的增大也将带来匹配和解析正确性的考验。这一篇我们会进一步深入URL的学习,并掌握Reverse和Resolve。

一:Reverse和Resolve的作用
我们可以为某一个url映射定义一个名字,称之为url_name,这样有什么用呢?在此之前我们先介绍Reverse和Resolve的含义,函数模板如下:


# 其中viewname表示url_name

# 其余的只要理解args即可,表示一些必要的参数,详见例子

# 作用:从url_name得到URL

reverse(viewname[, urlconf
=
None
, args
=
None
, kwargs
=
None
, current_app
=
None
])

# path表示url

# 作用: 从url得到相互映射的url_name

resolve(path, urlconf
=
None
)

那什么情况下我们需要用到它们呢?第一,如果在你的Project中需要给出一个网址(如网页重定向等),我们可以通过传递给Reverse函数相应的url_name以及必要的参数,那么便会生成相应的url;第二,在你调试阶段,可以通过Resolve函数来测试你的网站的URL对应关系是否如你所愿。

二:一个简单的例子
修改mysite/urls.py成如下代码:


from
django.conf.urls
import
patterns, include, ur

home
=
‘hello.views.home‘

urlpatterns
=
patterns(‘‘,

    
url(r
‘^test$‘
, home, name
=
"test_hello"
),

    
url(r
‘(\d{4})/(\d{2})$‘
, home, name
=
"test_hello_2"
),

)

在网站根目录下运行:python manage.py shell进入DJango提供的shell环境.然后依次输入如下命令,你可以好好理解一下它们的输出结果:


#这一段曾经有错误,感谢xd(见评论区)同学的指正,万分感谢

from
django.core.urlresolvers
import
reslove, reverse

url
=
resolve(
‘/2012/10‘
)

print
url.url_name               

#输出应为test_hello_2

reverse(
‘test_hello_2‘
,args
=
(
‘2012‘
,
‘10‘
))

#输出应为/2012/10

三:URL Include的目的
当一个Project的模块增多,只在根目录下维护一个urls.py来管理全局的URL对应关系显然是不合适的。如果每个模块都能管理和自己相关的URL,而根目录下的urls.py只负责把它们全部包含进来,不就解决问题了么?这有点像是C/C++里头文件的概念。URL Include的模板如下:


# regex 是正则式

# URL_FILE_NAME 是子模块的urls.py

url(regex, include(
‘URL_FILE_NAME‘
))

四:Include的例子
在hello文件下新建urls.py如下:


from
django.conf.urls
import
patterns, include, url

home
=
‘home‘

urlpatterns
=
patterns(‘‘,

    
url(r
‘^$‘
, home),

)

然后修改mysite/urls.py,增加如下一行即可:


url(r
‘^‘
, include(
‘hello.urls‘
)),

现在通过python manage.py runserver启动服务器,在网址输入localhost:8000是不是显示正常呢?如果正常则说明我们include成功了。

不知道你注意到了没有,在mysite/urls.py的正则表达式里面是没有$的。原来在include的用法里,要匹配子模块的urls时是要先通过父模块的匹配,举个例子,如果mysite/urls.py中的匹配为:’^t’,那么传递进include中时是从t之后的开始的!

时间: 2024-08-06 10:50:15

DJango — URL的Reverse和Resolve的相关文章

django url调度

Django的url配置同样遵循着DRY(dont repeat yourself)的规则.以下都是官方文档的例子: 首先介绍的是Django如何处理http的请求: 1.在setting里定义ROOT_URLCONF ,这个值就是url的根配置,但若被request processing中间件定义了HttpRequest的urlconf属性,会替换掉ROOT_URLCONF 2.Django 加载模块,寻找 urlpatterns,它是pattern函数的返回值,是url的list 3.寻找每

06 Django URL name详解

1.打开urls.py from django.conf.urls import url from django.contrib import admin from Django_App import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/',views.index), url(r'^$',views.index), url(r'^login',views.login), url(r'^add/$

django -- url (模版语言 {% url 'test1' param1=5 param2=6 %})

如果想让form表单提交的url是类似 action="/index-5-6.html" 这样的,可以在html模版语言中使用{% url 'test1' param1=5 param2=6 %} urls.py from django.conf.urls import url, include from mytest import views urlpatterns = [ url(r'^index-(?P<param1>\d+)-(?P<param2>\d+

转 Django url 标签的使用

Django url 标签的使用 期初用django 开发应用的时候,完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRedirect()也是硬编码转向地址,当然在template 中也是一样了,这样带来一个问题,如果在urls.py 中修改了某个页面的地址,那么所有的地方(views.py和template中)都要修改.如果是个很大的工程,那么要修改的地方就很多.当然,你也许会选择一个工具,直接查找替换来实现.除此之外呢..... 其实django 本身就

Django UrL 解析

Django的路由系统 URLconf 本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行. 1.1 django版本2.0以下的url配置 from django.conf.urls import url # 支持正则匹配 from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r

django URL反向解析和命名空间

一.反向解析URL 在实际的Django项目中,经常需要获取某条URL,为生成的内容配置URL链接. 比如,我要在页面上展示一列文章列表,每个条目都是个超级链接,点击就进入该文章的详细页面. 现在我们的urlconf是这么配置的:^post/(?P<id>\d+). 在前端中,这就需要为HTML的<a>标签的href属性提供一个诸如http://www.xxx.com/post/3的值.其中的域名部分,Django会帮你自动添加无须关心,我们关注的是post/3. 此时,一定不能硬

Django url (路由)

**1.路由的基本使用:** ? #url 是个函数,有四个参数,第一个参数要传正则表达式,第二个参数传函数内存地址,第三个传默认参数,第四个传路由别名 ? url(r'^yaopipqideneirong/article/aa.html$',views.test), ? -路由从上往下匹配,一旦匹配成功,后面就不继续匹配了 **2.路由的无名分组** ? url(r'test2/(\d+)/(\w+)$',views.test2), ? 无名分组分出几个值,试图函数就要接受几个值(位置参数形式

django url 反响解析,视图

1. 内容回顾 1. 模板语言(字符串替换) 1. 母版和继承 1. 什么时候用母版? html页面有重复的代码,把它们提取出来放到一个单独的html文件. (比如:导航条和左侧菜单) 2. 子页面如何使用母版? {% extends 'base.html' %} --> 必须要放在子页面的第一行 母版里面定义block(块),子页面使用block(块)去替换母版中同名的块 2. 组件 1. 什么时候用组件? 重复的代码,包装成一个独立的小html文件. 2. 如何使用? {% include

django url别名和反向解析 命名空间

url别名和反向解析 我们平时写的url名字都是死的,如果项目过大,需要项目中某个文件名改动一下,那么改动起来就不是一般的麻烦了,所以我们就在定义的时候给url起一个别名,以后不管哪个文件中运用都是用它的别名,这样就方便多了,你的路径名不管怎么改变都不会影响你的操作 如何给你url起别名 url(r'^home1/',views.home,name='home'), # 像这样,在url后边加一个name叫做home,之后再其他的文件中需要引用这个url就可以直接使用别名 url(r'^home