django反向解析URL和URL命名空间的方法


Posted in Python onJune 05, 2018

本文介绍了django反向解析URL和URL命名空间,分享给大家,具体如下:

首先明确几个概念:

1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定.

2.一个django项目中一般包含了多个django应用(app).

3.一个视图(view)往往对应多个url地址.

在django中实现反向解析URL必备条件就是 url和view能一对一 的匹配.

(通过view找到唯一一个对应的url,通过url也能找到唯一一个view)

最 简单的方式 就是使用 name ,可以理解为url起了一个名字.

例如:

from django.conf.urls import url
from . import views

urlpatterns = [
 #...
 url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
 #...
]

此时的 news-year-archive 就可以表示 /articles/nnnn/ 在view中进行使用.

在templates中使用

<a href="{% url 'news-year-archive' 2012 %}" rel="external nofollow" >2012 Archive</a>

在view中使用

from django.urls import reverse
from django.http import HttpResponseRedirect

def redirect_to_year(request):
 # ...
 year = 2006
 # ...
 return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

但是使用 name 也存在一定的 问题 ,比如在同一个项目中的不同的app中 name 可能会重名(导致反解析时一个view对应多个url),而且给每一个url起不同名字也很繁琐.

这时候就会用到 URL命名空间

URL命名空间包括两个部分: app_name ( 应用命名空间 )以及 namespace ( 实例命名空间 )

对于 app_name 官方解释"它表示正在部署的应用的名称。一个应用的每个实例具有相同的应用命名空间。",比较好理解.

也就是说可以通过设置 app_name 来区分不同app中同名的 name 了,使用 : 连接.

但是对于 namespace 官方解释"它表示应用的一个特定的实例。 实例的命名空间 在你的全部 项目中 应该是 唯一 的。但是,一个实例的命名空间可以和应用的命名空间相同。",就比较的难以理解.

namespace 主要功能为了区分同一个app下不同实例,使得反解析url时能获得正确的结果.

例如:

在不加入 namespace 时,访问 http://127.0.0.1:8000/ccc/aaa/ 和 http://127.0.0.1:8000/bbb/aaa/

结果均为 /ccc/aaa/ ,这显然不是我们想要获取的结果.

# 主url.py
urlpatterns = [
 ...
 url(r'^bbb/', include("test_namespace2.urls")),
 url(r'^ccc/', include("test_namespace2.urls")),
 ...
]

# test_namespace2/url.py
app_name = "app02"

urlpatterns = [
 url(r'aaa/$', views.aaa, name="index"),
]

# test_namespace2/view.py
def aaa(request):
 return HttpResponse(reverse("app02:index"))

做出一些修改,加入 namespace 用作区别

# 主url.py
urlpatterns = [
 ...
 url(r'^bbb/', include("test_namespace2.urls", namespace='bbb')), # 加入了namespace
 url(r'^ccc/', include("test_namespace2.urls", namespace='ccc')),
 ...
]

# test_namespace2/view.py
def aaa(request):
 return HttpResponse(reverse("app02:index", current_app=request.resolver_match.namespace)) # 使用namespace

这样就会获得正确的结果了.

使用方式:

首先在,主url.py中添加 namespace

urlpatterns = [
 url(r'^polls/', include('polls.urls',namespace='test')),
]

然后要在app的urls.py中添加 app_name name

比如:

app_name = 'polls'
urlpatterns = [
 #...
 url(r'^$', views.index, name='index'),
 #...

然后在view和templates中使用了,此时就算有多个app中都有名为 index 的 name 也不会有问题了

使用方式,使用形如 app_name:name

在view中使用:

reverse('polls:index', current_app=request.resolver_match.namespace)

在templates中使用

{% url 'polls:index' %}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的列表知识点汇总
Apr 14 Python
python实现分页效果
Oct 25 Python
基于Django的ModelForm组件(详解)
Dec 07 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
python 图像平移和旋转的实例
Jan 10 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 Python
python 下划线的多种应用场景总结
May 12 Python
python中的None与NULL用法说明
May 25 Python
Python实现自动玩连连看的脚本分享
Apr 04 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 #Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 #Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 #Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 #Python
Numpy array数据的增、删、改、查实例
Jun 04 #Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 #Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 #Python
You might like
Protoss魔法科技
2020/03/14 星际争霸
模拟xcopy的函数
2006/10/09 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
2017/08/03 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
Python中的random()方法的使用介绍
2015/05/15 Python
Python中的lstrip()方法使用简介
2015/05/19 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
大三在校生电子商务求职信
2013/10/29 职场文书
播音主持女孩的自我评价分享
2013/11/20 职场文书
赔偿协议书范本
2014/04/15 职场文书
调解协议书
2014/04/16 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
在职证明格式样本
2015/06/15 职场文书
教师研修随笔感言
2015/11/18 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis