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标准库之循环器(itertools)介绍
Nov 25 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
python-str,list,set间的转换实例
Jun 27 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
Python中dict和set的用法讲解
Mar 28 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
Python对象的属性访问过程详解
Mar 05 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 Python
利用python+request通过接口实现人员通行记录上传功能
Jan 13 Python
python 爬取天气网卫星图片
Jun 07 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
斜45度寻路实现函数
2009/08/20 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
Python中的一些陷阱与技巧小结
2015/07/10 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
匡威英国官网:Converse英国
2018/12/02 全球购物
简历中自我评价分享
2013/10/09 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
自主招生推荐信范文
2014/05/10 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
报名委托书
2015/01/29 职场文书
同意离婚答辩状
2015/05/22 职场文书
ubuntu下常用apt命令介绍
2022/06/05 Servers