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端口扫描系统实现方法
Nov 19 Python
Python高级特性切片(Slice)操作详解
Sep 27 Python
python 产生token及token验证的方法
Dec 26 Python
python3实现逐字输出的方法
Jan 23 Python
Pyqt5实现英文学习词典
Jun 24 Python
python文字转语音实现过程解析
Nov 12 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
Python字符串hashlib加密模块使用案例
Mar 10 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
keras中的卷积层&amp;池化层的用法
May 22 Python
详解Python设计模式之策略模式
Jun 15 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 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
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
2010/02/07 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python处理圆角图片、圆形图片的例子
2014/04/25 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
简单了解python PEP的一些知识
2019/07/13 Python
Django和Flask框架优缺点对比
2019/10/24 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
什么是属性访问器
2015/10/26 面试题
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
经典大学生求职信范文
2014/01/06 职场文书
仓库管理计划书
2014/05/04 职场文书
诚信教育主题班会
2015/08/13 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
小学教代会开幕词
2016/03/04 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis