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中用Spark模块的使用教程
Apr 13 Python
Python中处理字符串之islower()方法的使用简介
May 19 Python
linux下python抓屏实现方法
May 22 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
Python中的pack和unpack的使用
Mar 12 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
Apr 22 Python
python实现一个简单的ping工具方法
Jan 31 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
20行Python代码实现视频字符化功能
Apr 13 Python
教你怎么用Python实现多路径迷宫
Apr 29 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
用PHP产生动态的影像图
2006/10/09 PHP
基于php无限分类的深入理解
2013/06/02 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
python书籍信息爬虫实例
2018/03/19 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
python字符串的拼接方法总结
2019/11/18 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
村党建工作汇报材料
2014/11/02 职场文书
同意报考公务员证明
2015/06/17 职场文书
停车场管理制度范本
2015/08/05 职场文书
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android