03 路由层
1. 路由的作用
路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在urls.py中
路由匹配
# 路由匹配
url(r'test',views.test),
url(r'testadd',views.testadd),
# 首页匹配
url(r'^$',views.home)
'''
url方法第一参数是正则表达式
只要第一参数正则表达式能够匹配到内容,那么就会立刻停止往下匹配,直接执行对应的视图函数
你在输入url的时候会默认加斜杠
django内部帮你做到重定向
django 2.x版本中只有path和repath没有url,但是repath和url功能一样,可以匹配正则,path不可以匹配正则,写什么匹配什么
'''
无名分组
'''
分组:就是给某一段正则表达式用小括号括起来
'''
url(r'^test/(\d+)',views.test)
def test(rquest,xx):
print(xx)
return HttpResponse('test')
# 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
有名分组
'''
可以给正则表达式起一个别名
'''
url(r'^testadd/(?P<year>\d+)',views.testadd)
def testadd(request,year):
print(year)
# 有名分组就是将括号内正则表达式匹配到的内容当做关键字参数递给后面的视图函数
无名有名是否可以混合使用?
不能混用,但是同一个分组可以使用多次
反向解析
# 通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数
# 先给路由与视图函数起一个别名
url(r'^funckk/', views.func,name='wyz')
# 反向解析
# 后端反向解析
from django.shortcuts import render, HttpResponse, redirect,reverse # 导一个reverse
reverse('wyz') // 别名
# 前段方向解析
<a href="{% url 'wyz' %}">11</a> # wyz为别名
无名有名分组反向解析
# 无名分组反向解析
url(r'^index/(\d+)/', views.index, name='wyz')
# 前端
{% url 'wyz' 123 %}
# 后端
reverse('wyz', args=(1,))
'''
这个数字写代码的时候应该放什么
数字一般情况下放的是数据的主键值,数据的编辑和删除
url(r'^index/(\d+)/', views.index, name='wyz')
'''
# 有名分组反向解析
url(r'^func/(?P<year>\d+)/', views.func,name='ooo'),
#后端
#写法1,了解
print(reverse('ooo',kwargs={'year':123}))
#简单写法,与无名一样
print(reverse('ooo',args=(111,)))
#前端
<a href='{% url 'ooo' year=123 %}'>1111</a> 了解即可
<a href='{% url 'ooo' 123 %}'>1111</a> 记忆
路由分发
django的每一个应用都可以有自己的templates文件 urls.py static文件夹
正是基于上述的特点,django能够非常好的做到分组开发(每个人只写自己的app)
作为组长,只需要将手下书写的app全部拷贝到一个新的django项目中,然后配置文件里面注册所有的app再利用路由分发的特点将所有的app整合起来
当一个django项目中的url特别多的时候,总路由urls.py代码非常冗余不好维护,这个时候也可以利用路由分发来减轻总路由的压力
路由分发写法:
from django.conf.urls import url,include
# 路由分发
# url(r'^app01/', include(app01_urls)), # 只要url前缀是app01开头,全部交给app01处理
# url(r'^app02/', include(app02_urls))
# 终极写法
url(r'^app01/', include('app01.urls')),
url(r'^app/', include('app02.urls'))
注意:总路由里面的url千万不能加$结尾
名称空间
一般情况下 有多个app的时候我们在其别名的时候会加上app的前缀,这样的话就能够确保多个app之间名字不冲突的问题