引子

  django是一个比较全能的web框架,比如它实现了自己的orm模型来对接不同的数据库、并提供了方便的数据接口;django牛逼的地方

  还有许多,如他实现了自己的模板语言,这样我们就能方便的做出数据驱动的动态网站;引入了app的概念而且app是可插拔的,这样代码

  的复用级别就更高了,不在是function级别或class级别。django的app是可以自由分发的、假设我写好了一个博客功能的app,你只要把这

  这app引入到你的网站,那么你的网站就有博客功能了。

  方便是不假、但是还是有一些要注意的地方、假设我的博客app中定义了一个叫“create”的url,如果你自己的app也定义一个叫“create”的

  url就会引起冲突了

  面对上面的问题一种可选的解决方案就是把url的名字起的尽可能的唯一、然而最好的解决方案就是引入“命名空间”为每一个app定义

  一个“命名空间”,通过“命名空间”来区分url

1、看一下没有引入命名空间的情况

  在这个例子中我会定义两个app分别叫app001、app002 每一个app都有自己的一个页面,由于我们app比较简单一个app就只有一个页面,

  我想把这个页面的url名字叫“main-page”,但是两个app都有一个叫“main-page”的页面就会引起冲突,所以我为了避免这件事情的发生

  我还要给不同的app中的“main-page”加上一个唯一的后缀。搞定之后整个项目看起来就像这样  

  

  整个项目看起来就像上面的图像一样了

  app001的关键内容如下:

  app001/view.py

from django.shortcuts import render
from django.http import Http404,HttpResponse def main_page(request):
return render(request,"app001/main-page.html")

  app001/urls.py

from django.urls import path
from . import views #app_name="app001" urlpatterns = [
path('', views.main_page,name="main-page-xxx"),
]

  app001/templates/app001/main-page.html

<!DOCTYPE html>
<html>
<head>
<title>app001 的主页</title>
</head> <body>
<h1>app001</h1>
<a href="{% url 'main-page-xxx'%}">去往app001的主页</a>
</body>
</html>

   app002的关键内容如下

  app002/view.py

from django.shortcuts import render

# Create your views here.

def main_page(request):
"""
main_page function in app002
"""
return render(request,'app002/main-page.html')

  app002/urls.py

from django.urls import path
from . import views #app_name="app002" urlpatterns = [
path('', views.main_page,name="main-page-yyy"),
]

  app002/templates/app002/main-page.html

<!DOCTYPE html>
<html>
<head>
<title>app02的主页</title>
</head>
<body>
<h1>app002的主页</h1>
<a href="{% url 'main-page-yyy'%}">app002 main page</a>
</body>
</html>

  在template中为了防止硬编码url路径,我使用了{% url 'url-name' %}来生成url,这个也是django的推荐使用习惯,为了防止url的名子重复

  我在第一个app里把“main-page”加上了后缀“xxx”,第二个里加上了“yyy”。这样做使得url的名字变长了不少,而且多出来的部分并没有特别

  的字句意义。

【2、引入命名空间

  命名空间的引入并不要做多少工作,只要在usrl.py文件中加一个“app_name”就可以了,在加入命名空间后模板中就可以直接通过命名空间来

  引用url了,下面以app001引入命名空间为例

from django.urls import path
from . import views app_name="app001" #引入命名空间、命名空间的名字最好和app的名字相同 urlpatterns = [
path('', views.main_page,name="main-page"),
]

  引入名字空间之后就可以根据命名空间来引用url了

<!DOCTYPE html>
<html>
<head>
<title>app001 的主页</title>
</head> <body>
<h1>app001</h1>
<a href="{% url 'app001:main-page'%}">去往app001的主页</a>
</body>
</html>

总结:

  引入命名空间后就算有相同的url名存在、也不会有问题,因为命名空间可以隔离它们了。

----

django url 中的namespace详解的更多相关文章

  1. C++中的namespace详解

    原文链接:http://blog.csdn.net/yao_zhuang/article/details/1853625 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的 ...

  2. WCF中队列服务详解

    WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...

  3. C#中的Attribute详解(下)

    原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...

  4. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  5. 微信公众开发URL和token填写详解

    微信公众开发URL和token填写详解 方法/步骤     作为一名微信公众号开发者,别人进入你的微信公众号,肯定会看见某些网页,或者给你发某些信息,你需要实时自动回复,所以你需要一个24小时为用户服 ...

  6. DIV css中cursor属性详解-鼠标移到图片变换鼠标形状 (转)

    css中cursor属性详解-鼠标移到图片变换鼠标形状   语法: cursor : auto | all-scroll | col-resize| crosshair | default | han ...

  7. 「翻译」Unity中的AssetBundle详解(一)

    AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...

  8. js插件---videojs中文文档详解

    js插件---videojs中文文档详解 一.总结 一句话总结: js插件网上都有很多参考资料,使用起来也非常简单 二.lavarel中使用实例 <video id="example_ ...

  9. Linux ns 4. UTS Namespace 详解

    目录 1. 使用简介 1.1 hostname 1.2 domainname 1.3 uname 2. 代码分析 2.1 copy_utsname() 2.2 sethostname() 2.3 ge ...

随机推荐

  1. IDEA引入外部jar包的方法

    在做发短信的功能(阿里大于)的时候,我只是吧jar包拷贝到了项目的external library. 拷贝进来之后我用junit写了test方法,可以完美发送短信到手机,但是我这是个web项目,然后我 ...

  2. python的traceback模块

    import traceback try: 1/0 except Exception,e: traceback.print_exc() 输出结果是 Traceback (most recent cal ...

  3. Fiddler Web Debugger简单调试头部参数

    POST接口时头部参数如下: User-Agent: Fiddler Host: api.***.com Content-Length: Content-Type: application/json ...

  4. 索引快速扫描(index fast full scan)

    一.索引快速扫描(index fast full scan) 索引快速全扫描(INDEX FAST FULL SCAN)和索引全扫描(INDEX  FULL SCAN)极为类似,它也适用于所有类型的B ...

  5. 转 configure: error: *** libmcrypt was not found解决方案

    安装到mcrypt的时候出现了问题./configure提示出错,首先提示*** Could not run libmcrypt test program, checking why…*** The ...

  6. vmware中的 CentOS7 虚机磁盘动态扩容

    0.在vmware的配置项中,将虚机的磁盘大小调大,步骤简单,此处略 查看当前状态 文件系统状态 df -h 磁盘状态 lsblkfdisk   -l  1.首先要再创建一个物理分区 (使用fdisk ...

  7. 读书笔记——spring cloud 中 HystrixCommand的四种执行方式简述

    读了<Spring Cloud 微服务实战>第151-154页, 总结如下: Hystrix存在两种Command,一种是HystrixCommand,另一种是HystrixObserva ...

  8. Linux软硬连接

     曾经对软硬连接一直搞不明白,关键是怕操作错误. 硬链接不能跨区实现连接,硬链接是对原始文件的镜像,同一个inode,软连接是快捷方式,inode保存的是快捷方式的.原始文件删除,导致软连接文件无效. ...

  9. Ubuntu16.04, Gqrx通过RTL-SDR的Q通道收听中短波

    硬件准备 天线: 一根悬垂的3~4米长线天线, 如果只是临时使用, 直接用普通的0.75平方的聚氯乙烯多股软电线就可以了. 巴伦: 9:1巴伦 接收器: Q通道增加低频输入的RTL-SDR接收器 以及 ...

  10. H5类似易企秀/编辑器/页面制作/开发/生成工具/软件/源码/授权

    代码地址如下:http://www.demodashi.com/demo/14960.html 项目简介 H5DS (HTML5 Design software) 这是一款基于WEB的 H5制作工具. ...