一、 URL name详解

from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views urlpatterns = [
url(r'^add/$', calc_views.add, name='add'),
url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
url(r'^admin/', admin.site.urls),
]

url(r'^add/$', calc_views.add, name='add'), 这里的 name='add' 是用来干什么的呢?

简单说,name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个名字”,只要这个名字不变,网址变了也能通过名字获取到。

模板中可以这样利用name

不带参数的:
{% url 'name' %} 带参数的:参数可以是变量名
{% url 'name' 参数 %}

结合上面的urls.py

不带参数:
<a href="{% url 'add' %}">添加</a> 上面模板经过渲染后的标签是这样的:
<a href="/add/">添加</a> 带参数的:
<a href="{% url 'add2' 4 5 %}">link</a> 经过渲染后:
<a href="/add/4/5/">link</a>

当 urls.py 进行更改,前提是不改 name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成:

url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

注意: add 变成了 new_add,但是后面的 name='add2'没改,这时 {% url 'add2' 4 5 %} 就会渲染对应的网址成/new_add/4/5/

向视图传递额外的参数

url()中允许你传递一个Python字典作为额外的关键字参数给视图函数。

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

在上面的例子中,对于/blog/2005/请求,Django将调用views.year_archive(request, year='2005', foo='bar')。

注意:命名关键字参数和在字典中传递的额外参数要避免重名。

利用reverse函数反向生成URL

urls.py

from app01 import views as views

urlpatterns = [
url(r'^login/',views.login),
url(r'^index/first/',views.index,name='first'),
]

views.py

from django.shortcuts import render,HttpResponse,redirect
from django.urls import reverse def login(request):
url = reverse('first')
print(url) # 打印结果:/index/first/
return redirect(url) def index(request):
return HttpResponse('index/first')

对有参数的url设置name

urls.py:

from django.conf.urls import url

from . import views

urlpatterns = [
#...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...
]

模板代码中使用:

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>   # 注意模版语言的用法,注意参数的传递方法
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

views.py视图函数:

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,)))

二、include路由转发

通常,我们会在每个app里,各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的urls.py模块中。

创建两个app:cmdb和openstack,并分别在这两个app目录下创建urls.py文件

from django.conf.urls import url,include
# 需要先导入include函数
from django.contrib import admin
from app01 import views urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^cmdb/',include('cmdb.urls')),
url(r'^openstack/',include('openstack.urls')),
]

传递额外的参数给include()

参数会传递给include指向的urlconf中的每一行,例如,下面两种URLconf配置方式在功能上完全相同:

配置一:

# main.py
from django.conf.urls import include, url urlpatterns = [
url(r'^blog/', include('inner'), {'blogid': 3}),
] # inner.py
from django.conf.urls import url
from mysite import views urlpatterns = [
url(r'^archive/$', views.archive),
url(r'^about/$', views.about),
]

配置二:

# main.py
from django.conf.urls import include, url
from mysite import views urlpatterns = [
url(r'^blog/', include('inner')),
] # inner.py
from django.conf.urls import url urlpatterns = [
url(r'^archive/$', views.archive, {'blogid': 3}),
url(r'^about/$', views.about, {'blogid': 3}),
]

注意,只有当你确定被include的URLconf中的每个视图都接收你传递给它们的额外的参数时才有意义,否则其中一个以上视图不接收该参数都将导致错误异常。

三、URL命名空间

URL命名空间可以保证反查到唯一的URL。

urls.py

from django.conf.urls import url,include

urlpatterns = [
url(r'^cmdb/',include('cmdb.urls',namespace='cmdb')),
url(r'^openstack/',include('openstack.urls',namespace='openstack')),
]

cmdb/urls.py

from django.conf.urls import url
from cmdb import views urlpatterns = [
url(r'host/',views.host,name='host'),
]

在模板中使用

<a href="{% url 'cmdb:host' %}">跳转</a>

在视图中利用reverse()函数反向生成url

from django.shortcuts import render,HttpResponse,redirect
from django.urls import reverse
def host(request):
url = reverse('cmdb:host')
print(url) # 打印结果:/cmdb/host/
return HttpResponse('cmdb.host')

注意:namespace与name在模板文件和视图函数中使用的时候要用冒号分隔,如:“cmdb:host”

四、include()本质

include()函数实际上就是返回一个元组:([], None, None)
第一个元素可以是一个列表,列表中盛放url()子路由配置;
第二个元素是app_name,可以为None;
第三个元素是namespace,需要反向生成url时,可根据需求填写;

所以urls.py也可以这样写:

from django.conf.urls import url

urlpatterns = [
url(r'^openstack/',([],None,None,),
]

直接用一个元组替代include()

如下,直接进行子路由分发:

from django.conf.urls import url,include
from cmdb import views as cviews
from app01 import views urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^index/',views.index,name='index'),
url(r'^cmdb/',include('cmdb.urls',namespace='cmdb')),
# url(r'^openstack/',include('openstack.urls',namespace='openstack')),
url(r'^openstack/',([
url(r'^host/',cviews.host,name='host'),
url(r'^host/add/',cviews.addhost,name='addhost'),
url(r'^host/(\d+)/change',cviews.changehost,name='changehost'),
],None,'openstack')),
]

以上元组中的'openstack',就相当于include()函数的namespace='openstack'

作者:天佑俊辰
链接:https://www.jianshu.com/p/0e5bdc73fcab
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Django之include本质的更多相关文章

  1. Django之web本质

    Django之web本质 Web的本质,是基于socket玩的. 在我们上网的过程中,一个访问请求是如何工作的. Web的框架: 网络的连接都是基于Socket 在连接中有TCP/UDP 和HTTP协 ...

  2. 源码解析Django CBV的本质

    Django CBV模式的源码解析 通常来说,http请求的本质就是基于Socket Django的视图函数,可以基于FBV模式,也可以基于CBV模式. 基于FBV的模式就是在Django的路由映射表 ...

  3. Django:web框架本质

    一,web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 1,自定义web框架 impo ...

  4. [oldboy-django][1初始django]web框架本质 + django框架 + ajax

    web框架本质 浏览器(socket客户端) - 发送请求(ip和端口,url http://www.baidu.com:80/index/) - GET 请求头(数据请求行的url上: Http1. ...

  5. Django _web框架本质

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. socket服务端 import  ...

  6. Django URLconf

    Django提供了干净优雅的 URL 方案,URL配置文件是一个标准的 python 文件,支持动态配置.它的本质就是URL模式与调用的视图函数之间的映射表,最简单的配置文件如下: from djan ...

  7. Python之路,Day14 - It's time for Django

    Python之路,Day14 - It's time for Django   本节内容 Django流程介绍 Django url Django view Django models Django ...

  8. web框架之Django基础

    1. Django的简介 Django是一个由python写成的开放源代码的Web应用框架. Django的目的是使常见的Web开发任务,快速和容易. 2. Django框架的特点 1. 遵循MVC开 ...

  9. Django之REST framework源码分析

    前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...

随机推荐

  1. IO(Properties、序列化流、打印流、CommonsIO)

    第1章 Properties类 1.1 Properties类介绍 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字 ...

  2. is 和 == 区别 编码的问题 id()函数

    一丶is 和 == 的区别 == 比较的是值 is 比较的是内存地址 #字符串 a = "abc" b = "abc" print(a == b) print( ...

  3. 《移动Web前端高效开发实战》笔记2——使用Gulp构建一个ECMAScript 6和Sass应用

    8.3.1 安装和配置 运行Gulp需要Node.js环境,请参看第二章内容搭建Node.js环境.使用NPM全局安装Gulp,命令如下: npm install gulp-cli –g 然后,在项目 ...

  4. JS移动端浏览器取消右划后退的几种方法

    在开发过程中,发现我们公司所使用的APP有点BUG,在APP中打开网页.H5应用之后,处于首页时,轻微的右划触发了后退事件,导致直接退出网页或者H5应用的页面,这样使得很多需要交互的手势没办法使用.本 ...

  5. O2O创业团队,遇到生死悠关的问题,希望大家支招?

    简单概括下情况:公司名下有两个内部创业团队,A团队成立3年以上,现在模式基本成熟稳定,有固定营收,但是还未收支平衡:B团队O2O项目,成立5个月左右,还处于萌芽阶段,技术+运营+市场共计9名成员,现总 ...

  6. cocos 2d-x 3.0配制环境

    cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑.每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大…… 但是凭心而论,3.0RC版本开始 ...

  7. java object默认的基本方法

    java object默认的基本方法中没有copy(),含有如下9个方法:  getClass(), hashCode(), equals(), clone(), toString(), notify ...

  8. mysql-单表操作

    mySql单表操作主要有一下内容: 1.查询:查询又分为几种,范围查询,模糊查询.空值查询.多条件查询 查询的语句格式为:SELECT 字段 1,字段 2,字段 3...FROM 表名 WHERE 条 ...

  9. UWP开发:自动生成迷宫&自动寻路算法(3)

    + , + ];//0<=x<=12 0<=y<=24 private static Random Rd = new Random(); 首先声明mazeMap存储数据,声明了 ...

  10. ASP.NET WebForm & MongoDB

    ASP.NET WebForm & MongoDB 最近在朋友介绍下,也跟着看AngularJS 买了一本三合一的书,Node.JS+MongoDB+AngularJS http://www. ...