django路由层

django路由层

django请求生命周期流程图

# django请求生命周期概念
Django请求的生命周期是指:当用户在浏览器上输入URL到用户看到网页的这个时间段内,Django后台所发生的事情

django请求生命周期流程

1.首先 用户在浏览器中输入信息,发送一个GET方法的request请求。
2.Django中封装了socket的WSGI服务器,监听端口接受这个request请求,在进行解析封装,然后传送到中间件中,这个request请求再依次经过中间件。
3.对请求进行效验处理,再传输到路由系统中进行路由分发,匹配相对应的视图函数,再将request请求传输到views中的这个视图函数中,进行业务逻辑处理。
4.调用modles模型层中表对象,通过orm拿到数据库(DB)的数据。
5.同时拿到templates中相应的模板进行渲染,然后将这个封装了模板response响应传输到中间件中,依次进行处理,最后通过WSGI再进行封装处理,响应给浏览器展示给用户。

路由层之路由匹配

# 路由匹配的特点
1.只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
2.直接执行对应的视图函数

urlpatterns = [
    url(r'test',views.test),
	url(r'testadd',views.testadd)
]

'上述代码路由匹配test 匹配成功后 就不会匹配testadd'

路由匹配演变方式

正则是test/ 内容是test 那么首次无法匹配
# django二次追加斜杠机制
首次匹配不上 那么django还会让浏览器默认加斜杠再次发送请求
    test  301
    test/ 200
# 修改方式   
url(r'test/', views.test),
url(r'testadd/', views.testadd) 


# 控制斜杠机制
	APPEND_SLASH = False
'可以取消 但是不推荐' 

# 路由随意匹配问题
1.正则是test/ 内容是dsdtest/ 那么可以匹配出文本test/
  	'可以在正则的最前面加上上箭头来限制'
2. 正则是^test/ 内容是test/abc/edf/acd/ 那么可以匹配出文本test/
  	'可以在正则的最后面加上$来限制    '
    
# 扩展
可以定制一个主页面 用户不携带后缀可以直接访问(掌握)
url(r'^$',views.home)
也可以定义一个尾页 用户输入一个没有对应关系的直接返回(了解)
url(r'.*',views.error)

无名有名分组

无名分组(位置参数)

url(r'^test/([0-9]{4})/$', views.test)

# 无名分组的概念
无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数

'''
路由匹配成功之后就会调用视图函数默认情况下会自动给视图函数传递一个request位置参数
	test(request)
如果路由匹配中使用括号对正则表达式进行了分组 那么在调用视图函数的时候
会将括号内匹配到的内容当做位置参数传递给视图函数
	test(request,括号内正则表达式匹配到的内容)
'''
# 无名分组的使用
urls.py
' 会把括号中匹配的数字当成位置参数传给视图函数'
url(r'^test/(\d+)/',views.test)

views.py
def test(request,xx):
    print(xx)
    return HttpResponse('test')
  

有名分组(关键字参数)

url(r'^testadd/(?P<user_id>[0-9]{4})$', views.testadd)

# 有名分组的概念
有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数

"""
给括号内的正则表达式起别名之后 匹配成功则会讲括号内匹配到的内容按照关键字参数传递给视图函数
	testadd(request,user_id=括号内正则表达式匹配到的内容)

上述特性django称之为'有名分组'
"""

无名有名分组使用

# 两者不可以混合使用
    url(r'^test/(\d+)/(?P<user_id>[0-9]{4})/$', views.testadd) 

# 单个可多次使用
  url(r'^test/(\d+)/(\d+)/$', views.testadd)   # 可以
  url(r'^test/(?P<a>\d+)/(?P<b>\d+)',views.testadd)  # 可以

def index(request,*args,**kwargs):
    print(args)
    return HttpResponse('index')

反向解析

# 针对的问题
1.页面上有很多a标签链接了其他路由
2.路由匹配表达式出现了变化 html页面上的地址全部失效

# 反向解析的概念
通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数
实现url路由频繁变化

#反向解析的本质: 
就是能够获得一个能够访问名字所对应的视图函数

# 反向解析的操作步骤
步骤1:给对应关系起别名
    url(r'^func1/',views.func,name='func_view')
    
步骤2:使用反向解析获取结果
    前端:
      	{% url 'func_view' %}  # func1/ 结果可以访问路由
    后端:
      	from django.shortcuts import reverse
      	reverse('func_view')  # func1/ 结果可以访问路由

无名有名分组反向解析

# 无名有名分组传值
无名有名反向解析中的手动传值 这个值在实际工作中可以是
一般情况下这个值可以是数据的主键值、页面的页码、区域的编号等

无名分组反向解析

1.给对应关系起别名
    url(r'^func666/(\d+)/',views.func,name='func_view')
2.:使用反向解析获取结果
    '''无法明确括号内正则表达式的内容 需要人为指定'''
    前端:
      	{% url 'func_view' 123 %}  # func666/123/
    后端:
      	from django.shortcuts import reverse
      	reverse('func_view',args=(666,))  # func666/666/

有名分组反向解析

步骤1:给对应关系起别名
    url(r'^func666/(?P<id>\d+)/',views.func,name='func_view')
步骤2:使用反向解析获取结果
    '''无法明确括号内正则表达式的内容 需要人为指定'''
    前端:
      	写法一:{% url 'func_view' 123 %}  # func666/123/
        写法二:{% url 'func_view' id=123 %}  # func666/123/
    后端:
      	from django.shortcuts import reverse
      	reverse('func_view',args=(666,))  # func666/666/
        reverse('func_view',kwargs={'id':1})  # func666/1/
        

路由分发

路由分发的简介

# 针对的问题
如果一个django项目特别庞大 里面有很多应用 每个应用下有很多对应关系 
那么django自带的路由层里面的代码就会非常非常的多

# 路由分发的概念
django支持每个应用都可以有自己独立的
		路由层、模板层、静态文件、视图层(默认)、模型层(默认)
		
上述特性能够让django在分组开发上更加的方便、快捷
	所有人都可以在应用中开发完整的项目功能
	最后汇总到一个空的django项目中 然后通过路由分发整合所有人的应用

总路由分发配置

# 1.需要导入一个include路由分发模块
from django.conf.urls import url,include

# 2.导入子路由的uls(重名问题 起别名)
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 1.路由分发
    url(r'^app01/',include(app01_urls)),  
    # 只要url前缀是app01开头 全部交给app01处理
    url(r'^app02/',include(app02_urls))   
    # 只要url前缀是app02开头 全部交给app02处理
    
'''     上述代码还可以简写
  from django.conf.urls import url, include
  url(r'^app01/',include('app01.urls')),
  url(r'^app02/',include('app02.urls')) '''

子路由配置

# 子路由
	# app01 urls.py
  from django.conf.urls import url
  from app01 import views

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


  # app02 urls.py
  from django.conf.urls import url
  from app02 import views

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

名称空间

# 应用场景
当多个应用出现了相同的别名 我们研究反向解析会不会自动识别应用前缀
 正常情况下的反向解析是没有办法自动识别前缀的
    
# 1.总路由增加一个名称空间
url(r'^app01/',include('app01.urls',namespace='app01')), 
'# 创建名称空间app01'
url(r'^app02/',include('app02.urls',namespace='app02'))  
'# 创建名称空间app02 '

# 2.应用反向解析自动提示
reverse('app01:index_view')
reverse('app02:index_view')

{% url 'app01:index_view' %}
{% url 'app02:index_view' %}

# 别名不能冲突(加上自己应用名作为前缀)
1.其实只要保证名字不冲突 就没有必要使用名称空间

2.解决方法
一般情况下 有多个app的时候我们在起别名的时候会加上app的前缀
这样的话就能够确保多个app之间名字不冲突的问题

url(r'^index/',views.index,name='app01_index_view')

 url(r'^index/',views.index,name='app02_index_view')
    

posted @   洛阳城门听风雨  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示