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中的join()方法的使用
May 19 Python
在Mac OS上搭建Python的开发环境
Dec 24 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
django如何实现视图重定向
Jul 24 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
Python xmltodict模块安装及代码实例
Oct 05 Python
几款好用的python工具库(小结)
Oct 20 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
Eclipse中php插件安装及Xdebug配置的使用详解
2013/04/25 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
提高网站信任度的技巧
2008/10/17 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
ES6正则的扩展实例详解
2017/04/25 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Python中的index()方法使用教程
2015/05/18 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
禁止高声喧哗的标语
2014/06/11 职场文书
ktv好的活动方案
2014/08/17 职场文书
营业员岗位职责范本
2015/04/14 职场文书