Django之include本质
一、 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本质的更多相关文章
- Django之web本质
Django之web本质 Web的本质,是基于socket玩的. 在我们上网的过程中,一个访问请求是如何工作的. Web的框架: 网络的连接都是基于Socket 在连接中有TCP/UDP 和HTTP协 ...
- 源码解析Django CBV的本质
Django CBV模式的源码解析 通常来说,http请求的本质就是基于Socket Django的视图函数,可以基于FBV模式,也可以基于CBV模式. 基于FBV的模式就是在Django的路由映射表 ...
- Django:web框架本质
一,web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 1,自定义web框架 impo ...
- [oldboy-django][1初始django]web框架本质 + django框架 + ajax
web框架本质 浏览器(socket客户端) - 发送请求(ip和端口,url http://www.baidu.com:80/index/) - GET 请求头(数据请求行的url上: Http1. ...
- Django _web框架本质
Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. socket服务端 import ...
- Django URLconf
Django提供了干净优雅的 URL 方案,URL配置文件是一个标准的 python 文件,支持动态配置.它的本质就是URL模式与调用的视图函数之间的映射表,最简单的配置文件如下: from djan ...
- Python之路,Day14 - It's time for Django
Python之路,Day14 - It's time for Django 本节内容 Django流程介绍 Django url Django view Django models Django ...
- web框架之Django基础
1. Django的简介 Django是一个由python写成的开放源代码的Web应用框架. Django的目的是使常见的Web开发任务,快速和容易. 2. Django框架的特点 1. 遵循MVC开 ...
- Django之REST framework源码分析
前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...
随机推荐
- 《移动Web前端高效开发实战》笔记3--代码检查任务
在项目的开发过程中,统一的代码风格对于项目的可协作性以及可维护性来说相当重要,因此可以采用一些插件来进行代码风格的检查. 本例中的源文件包含两类:Sass文件和采用ECMAScript 6规范的Jav ...
- Kendo UI Validator 概述
Kendo UI Validator 概述 Kendo UI Validator 支持了客戶端校驗的便捷方法,它基於 HTML 5 的表單校驗功能,支持很多內置的校驗規則,同時也提供了自定義規則的便捷 ...
- php分页代码及总结
代码部分: <?PHPheader("Content-type:text/html;charset=utf-8");$pageSize = 10;//接收传入的分页码$pag ...
- ORACLE中能否找到未提交事务的SQL语句
在Oracle数据库中,我们能否找到未提交事务(uncommit transactin)的SQL语句或其他相关信息呢? 关于这个问题,我们先来看看实验测试吧.实践出真知. 首先,我们在会话1(S ...
- web端 复合控件 响应回发
AutoPostback="true"; 自动提交 RdiobuttonList 属性→设计→编辑项→{ Enabled 是否可用 selected 是否选中 Text ...
- jQuery UI -- Repeater & 手风琴(Accordion)效果
jQuery UI -- Repeater & 手风琴(Accordion)效果 很简单的范例,完全不用写程序 直接套用就能做! 但是,基础不稳的人,连「复制贴上」直接套用, 对您而言,都困难 ...
- python爬虫之路——初识lxml库和xpath语法
lxml库:是xml解析库,也支持html文档解析功能,实用功能:自动修正补全html代码. 使用流程:①导入lxml中的etree库,②利用etree.HTML(文件名)或etree.parse(本 ...
- cookie和session是否可以保存对象
session看了一下,是可以保存对象的.语法很普通,但是cookie的话本身是只能保存string类型的信息的,这就需要先序列化,然后接收的页面反序列化后形成对象调用,为了防止乱码,需要在数据传输的 ...
- Harvest of Apples
问题 B: Harvest of Apples 时间限制: 1 Sec 内存限制: 128 MB提交: 18 解决: 11[提交] [状态] [讨论版] [命题人:admin] 题目描述 Ther ...
- 最大长度回文子串(Manacher's algorithm)
输出最大长度的回文子串. string longestPalindrome(string s) { int id, mx, i, j, len, maxlen; vector<char> ...