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练习程序批量修改文件名
Jan 16 Python
python每隔N秒运行指定函数的方法
Mar 16 Python
Python如何通过subprocess调用adb命令详解
Aug 27 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
老生常谈python中的重载
Nov 11 Python
Python面向对象之类和对象实例详解
Dec 10 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
基于python修改srt字幕的时间轴
Feb 03 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
python脚本第一行如何写
Aug 30 Python
python中用ctypes模拟点击的实例讲解
Nov 26 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
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
Python可跨平台实现获取按键的方法
2015/03/05 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
致垒球运动员加油稿
2014/02/16 职场文书
大学生毕业求职信
2014/06/12 职场文书
拉拉队口号
2014/06/16 职场文书
写给导师的自荐信
2015/03/06 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android