文档章节

DJango — URL的Reverse和Resolve

r
 ranvane
发布于 2014/09/20 22:12
字数 807
阅读 4478
收藏 2

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之后的开始的!


本文转载自:http://www.ccpt.cc/django_reverse_resolv/

r
粉丝 10
博文 61
码字总数 24206
作品 0
兰州
私信 提问
【译】自己动手写Django app,第四部分【全剧终】

原文地址:https://docs.djangoproject.com/en/1.4/intro/tutorial04/ 这个教程是从教程3剩下的地方开始的。我们继续网络调查应用程序并将关注简单的表单处理和精简我们的代码。 一、写一个简...

davidxp
2013/02/26
0
2
django server 500 error定位

环境信息 python使用的 2.7.6版本 结构如下:Nginx-----Gunicorn----Django gunicorn使用gevent模式 问题现象 用户一段时间没有登陆,在登陆系统后,页面显示server 500 error。用户刷新页面...

-启曙-
2016/03/01
161
0
[Django]几种重定向的方式

这里使用的是django1.5 需求: 有一个界面A,其中有一个form B, 前台提交B之后,后台保存数据之后,返回界面A,如果保存失败需要在A界面提示错误。 这里就需要后台的重定向,而且需要可以带着...

Amnesiasun
2017/06/22
0
0
Django-006视图与网址进阶

一、在网页上做加减法 1.采用/add/?a=5&b=6这样GET方法进行 修改Auto下面的views.py def add(request): a= request.GET['a'] b= request.GET['b'] c=int(a)+int(b) return HttpResponse(str(......

丰_申
2016/03/17
23
2
求助求助!!Django框架错误:ImportError at / No module named urls

Environment: Request Method: GET Request URL: http://127.0.0.1:8000/ Django Version: 1.7.1 Python Version: 2.7.11 Installed Applications: ('django.contrib.admin', 'django.contri......

huqiaosong
05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

texlive安装

Installing to: D:/bin/texlive/texlive/2019Installing [001/307, time/total: ??:??/??:??]: adobemapping [2130k]Installing [002/307, time/total: 00:03/08:57]: ae [84k]Installing......

MtrS
52分钟前
2
0
运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
今天
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
3
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部