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 相关文章推荐
web.py 十分钟创建简易博客实现代码
Apr 22 Python
python 异常处理总结
Oct 18 Python
python查询文件夹下excel的sheet名代码实例
Apr 02 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
20行python代码的入门级小游戏的详解
May 05 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
python UIAutomator2使用超详细教程
Feb 19 Python
pycharm Tab键设置成4个空格的操作
Feb 26 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 Python
django中websocket的具体使用
Jan 22 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
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
封装一个PDO数据库操作类代码
2009/09/09 PHP
Yii2中datetime类的使用
2016/12/17 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
小学教师听课制度
2014/02/01 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
务虚会发言材料
2014/12/25 职场文书
2016新年慰问信范文
2015/03/25 职场文书