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 Socket编程入门教程
Jul 11 Python
Python中unittest用法实例
Sep 25 Python
python使用marshal模块序列化实例
Sep 25 Python
python分析apache访问日志脚本分享
Feb 26 Python
python选择排序算法实例总结
Jul 01 Python
Python中elasticsearch插入和更新数据的实现方法
Apr 01 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
通过Python实现一个简单的html页面
May 16 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 Python
python3.x中安装web.py步骤方法
Jun 23 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 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获取文件相对路径的方法
2015/02/26 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
分享jQuery封装好的一些常用操作
2016/07/28 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
2019/02/21 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
python批量制作雷达图的实现方法
2016/07/26 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
python如何从键盘获取输入实例
2020/06/18 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
运动会的口号
2014/06/09 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
资产移交协议书
2016/03/24 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书