Django框架路由层-无名有名分组-无名有名分组反向解析
一:路由层
1.路由匹配(错误演示)
url方法第一个参数是正则表达式
1.只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
2.直接执行对应的视图函数
urlpatterns = [
url(r'test',views.test),
url(r'testadd',views.testadd)
]
2.路由匹配错误原因
匹配规则:
从上到下只要正则表达式匹配成功,就不会往下执行
1.所有当路由匹配到第一个正则的时候,就匹配成功了,不会往下执行
3.路由匹配(解决方式1)
你在输入url的时候会默认加斜杠,django内部帮你做到重定向
一次匹配不行,url后面加斜杠再来一次。
url(r'test/', views.test),
url(r'testadd/', views.testadd)
4.settings配置文件控制自动添加斜杠匹配
# settings配置文件内添加(控制django是否自动加斜杠匹配)
APPEND_SLASH = False/True # 默认是True自动加斜杠的
5.url方法第一个参数是正则表达式(正规使用url)
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 首页 默认进去
url(r'^$',views.home),
# 路由匹配
url(r'^test/$',views.test),
url(r'^testadd/$',views.testadd),
# 尾页(了解 后期异常捕获)
url(r'',views.error),
]
解析:
^ : 开头
$ : 结尾
二:无名分组(位置参数)
1.分组的概念
分组: 就是给某一段正则表达式用小括号扩起来
2.无名分组的概念:
无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
3无名分组使用
urls.py
# 会把括号中匹配的数字当成位置参数传给视图函数
url(r'^test/(\d+)/',views.test)
views.py
def test(request,xx):
print(xx)
return HttpResponse('test')
正则:
\d+ : 匹配多个任意数字
三:有名分组(关键字参数)
1.什么是有名分组?
可以给正则表达式起一个别名
2.有名分组的概念:
有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
3.有名分组使用
# 会把括号中匹配的数字当成关键字参数传给视图函数
url(r'^testadd/(?P<year>\d+)',views.testadd)
def testadd(request,year):
print(year)
return HttpResponse('testadd')
4.无名有名是否可以混合使用
6.有名分组无名分组是否可以混合使用?
1.利用有名分组和无名分组 我们就可以在调用视图函数之前给函数传递额外的参数
答:无名分组和有名分组不能混合使用
解:但是同一个分组可以使用N多次
7.单个的分组可以使用多次
1.无名分组单个使用多次
url(r'^index/(\d+)/(\d+)/(\d+)/',views.index),
2.有名分组单个使用多次
url(r'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),
def index(request,*args,**kwargs):
print(args)
return HttpResponse('index')
正则:
/(\d+)/(\d+)/(\d+)/ :匹配三个无名分组
/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/ : 匹配三个有名分组
四:反向解析
1.什么是反向解析?
当路由频繁变化的时候,html界面与后端上的连接地址如何做到动态解析?
根据自己设置的一个别名,动态解析出一个结果,该结构可以直接访问对应的url
2.反向解析概念:
通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数
实现url路由频繁变化,html界面与后端动态解析连接地址操作步骤:
3.反向解析路由配置
1.先给路由与视图函数起一个别名
url(r'^func_kkk/',views.func,name='ooo') # name='ooo' 起别名
4.前后端反向解析
# 后端视图函数反向解析
3.导入模块reverse
from django.shortcuts import render,HttpResponse,redirect,reverse
4.反向解析 关键字 reverse('ooo')
def home(request):
print(reverse('ooo'))
return render(request,'home.html')
# 前端反向解析
5.前端模板文件反向解析
<a href="{% url 'ooo' %}">111</a>
五:无名分组反向解析与有名分组反向解析
1.当路由出现无名有名分组反向解析需要传递额外的参数
2.无名有名分组反向解析,目的就是需要给一个参数,如果有多个就是需要手动的给多个,这多个参数一般情况都是当前操作数据的主键值。
- 当路由出现无名有名分组反向解析需要传递额外的参数
1.无名分组反向解析
1.路由配置
urlpatterns = [
# 首页
url(r'^$',views.home),
# 无名分组反向解析
url(r'^index/(\d+)/', views.index, name='xx')
]
2.后端反向解析
def index(request, args):
return HttpResponse('index')
def home(request):
# 只要正则表达式里面有正则符号反向解析的时候,就需要给一个正则符号能够匹配到的内容
print(reverse('xx', args=(1,)))
# 返回结果 可以访问到url /index/1
return render(request, 'home.html')
3.前端反向解析
{#给个数字 匹配正则\d+#}
<a href="{% url 'xxx' 123 %}"></a>
- 后端反向解析
- 前端反向解析
2.有名分组反向解析
1.路由配置
url(r'^func/(?P<year>\d+)/',views.func,name='ooo')
2.前端
{#有名分组反向解析 写法1#}
<a href="{% url 'ooo' year=123 %}">111</a>
{#简便写法 记跟无名一样的操作即可#}
<a href="{% url 'ooo' 123 %}">222</a>
3.后端
# 有名分组反向解析 写法1
print(reverse('ooo',kwargs={'year': 123}))
# 简便的写法 减少脑容量消耗 记跟无名一样的操作即可
print(reverse('ooo',args=(111,)))
-
后端反向解析
-
前端反向解析
3.总结
针对无名分组有名分组都可以使用一种(无名反向解析的形式)
反向解析的本质: 就是能够获得一个能够访问名字所对应的视图函数。