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线程的两种编程方式
Apr 14 Python
详解Python Socket网络编程
Jan 05 Python
Python中random模块生成随机数详解
Mar 10 Python
Python实现的多线程http压力测试代码
Feb 08 Python
python入门:这篇文章带你直接学会python
Sep 14 Python
python 求1-100之间的奇数或者偶数之和的实例
Jun 11 Python
python多线程同步实例教程
Aug 11 Python
Python字符串大小写转换拼接删除空白
Sep 19 Python
pytorch标签转onehot形式实例
Jan 02 Python
使用Python 自动生成 Word 文档的教程
Feb 13 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
用Python远程登陆服务器的步骤
Apr 16 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
模仿OSO的论坛(四)
2006/10/09 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
Python3计算三角形的面积代码
2017/12/18 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
Python实现TCP通信的示例代码
2019/09/09 Python
python 字典的打印实现
2019/09/26 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
python第三方库学习笔记
2020/02/07 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
浅析Python的命名空间与作用域
2020/11/25 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
护士进修自我鉴定
2014/02/07 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android