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 with用法实例
Apr 14 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
对python requests的content和text方法的区别详解
Oct 11 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python3 实现串口两进程同时读写
Jun 12 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
Python+PyQt5+MySQL实现天气管理系统
Jun 16 Python
使用BeautifulSoup4解析XML的方法小结
Dec 07 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 输出URL的快捷方式示例代码
2013/09/22 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Python笔记之facade模式
2019/11/20 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
如何利用find命令查找文件
2015/02/07 面试题
讲座主持词
2014/03/20 职场文书
廉洁使者实施方案
2014/03/29 职场文书
幼儿发展评估方案
2014/06/11 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
永远是春天观后感
2015/06/12 职场文书