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的Lambda函数与排序
Oct 25 Python
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
解决Python网页爬虫之中文乱码问题
May 11 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
Python从使用线程到使用async/await的深入讲解
Sep 16 Python
老生常谈python中的重载
Nov 11 Python
Django2.1.3 中间件使用详解
Nov 26 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
浅析Python 条件控制语句
Jul 15 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 Python
python 实现socket服务端并发的四种方式
Dec 14 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应用程序来获取Web服务器的状态信息
2006/10/09 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
2013/08/28 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
Python3访问并下载网页内容的方法
2015/07/28 Python
python清除函数占用的内存方法
2018/06/25 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
python实时监控logstash日志代码
2020/04/27 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
戴尔英国官网:Dell英国
2017/05/27 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
中餐厅主管的职责范文
2014/02/04 职场文书
电子银行营销方案
2014/02/22 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
首席执行官观后感
2015/06/03 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL