生命周期反向解析有无名分组

django基础三

一.django请求生命周期流程图

该图表示django的核心组成部分

二.路由层之路由匹配

1.对于urls内的前缀与功能对应得关系
  第一个参数是通过正则表达式来匹配,如果后缀能匹配上就执行对应得功能函数
2.二次追加机制
  对于第一次匹配不上那么django还会上浏览器家加上一个/再次发送请求  # 取消自动加斜杠得方式配置中APPEND_SLASH=False
3.由于是正则匹配
  所以要限制所有的情况只能让用户输入对应的后缀才能匹配上,所以在第一个参数的尾部加上$来限制尾部
4.定制首页
  url(r'^$',views.xxx)

三.有五名分组

1.无名分组
  eg:url(r'^test/([0-9]{4})/$', views.test)
  针对于这种情况会将分组匹配到的内容作为位置参数传给功能函数,首先传的第一个参数是request,其次是分组内容
2.又名分组
  eg:url(r'testadd/(?P<user_id>[0-9]{4})$',views.testadd)
  针对于这情况相当于分组匹配到的内容有了名字,它还是一个名字所以在传参的时候它是以user_id='xxx'传参也就是关键字参数
3.针对这两种方式是否可以混合使用
  eg:url(r'^test/(\d+)/(?P<user_id>[0-9]{4})/$', views.testadd)
  而这种情况是直接报错的
  可以全是又名的,也可以全是无名的

四.反向解析

1.html内a标签连接了其他的路由,路由匹配出现了变化html链接失效
  解决方式:通过反向解析
  第一步就是给路由取上别名
  eg:url(r'^func666/',views.func,name='func_view')
  第二步就是使用反向解析获取路由真实地址
  eg:html页面获取方式==>{% url 'func_view' %} 不管正则怎么改变都能获取到真正的固定正则
     后端获取固定正则:
    from django.shortcuts import reverse
    reverse('正则的别名') # 获取到固定的正则
2.针对与无名分组反向解析也就是匹配的内容不是固定的
url(r'^func666/(\d+)/',views.func,name='func_view')
  这种情况主要是正则匹配的内容不固定,里面的内容又是一个参数,所以这时候用反向解析时候前端和后端要手动给参数
 前端:{% url 'func_view' 123 %}  # func666/123/
 后端:from django.shortcuts import reverse
    reverse('func_view',args=(666,))
 3.又名分组反向解析
   url(r'^func666/(?P<id>\d+)/',views.func,name='func_view')
 获取结果不是唯一的需要指定参数
  前端:{% url 'func_view' 123 %} # func666/123/
       {% url 'func_view' id=123 %} 两种情况都能实现
  后端:from django.shortcuts import reverse
       reverse('func_view',args=(66,))
       reverse('func_view',kwargs={'id':88})
# 有无名反向解析的实际应用一般可以传入数据的主键值,页面的页码,区域编号

五.路由分发

1.app隔离式编写自己内部文件齐全
  在urls的后缀写对应的功能
   eg:  urlpatterns = [
    url(r'^index/',views.index111)
]
  eg:urlpatterns = [
    url(r'^index/',views.index)
]
2.针对于总的路由得功能主要是查看在那个app下然后在对应得app下查找后缀是否存在
方式1:
  from django.conf.urls import url, include
  from app01 import urls as app01_urls
  from app02 import urls as app02_urls
  url(r'^app01/',include(app01_urls)),
  url(r'^app02/',include(app02_urls))
方式2:
  from django.conf.urls import url, include
  url(r'^app01/',include('app01.urls')),
  url(r'^app02/',include('app02.urls'))
针对不同的app就是不同的前缀这样就不会导致访问得url冲突

六.名称空间

1.不同的应用使用了相同的别名使用反向解析
  index_view				app01/index/
  index_view				app02/index/
2.解决方式
 方式一;添加名称空间
    urls(r'^app01/',include('app01.urls',namespace='app01')),
 urls(r'^app01/',include('app01.urls',namespace='app01'))
生成名称空间之后反向解析会自动提示
reverse('app01:index_view')
reverse('app01:index_view')
{% url 'app01:index_view' %}
{% url 'app02:index_view' %}
方式二:别名不冲突
url(r'^index/',views.index,name='app01_index_view')
url(r'^index/',views.index,name='app02_index_view')

posted on 2022-05-12 19:55  淦白嫖怪  阅读(48)  评论(0)    收藏  举报

导航