Welcome!!!

F

伞兵一号,申请出战

Django(三)

Django(三)

Django请求生命周期流程图

路由层之路由匹配

# 路由的两个参数
	eg:
        url(r'^admin/', admin.site.urls)
       	第二个参数:接口函数(代码功能实现的入口)
        第一个参数:正则表达式(用来匹配访问的路径)
            
# 第一个参数
	这里Django使用正则来做地址匹配,将ip,端口号和这个正则匹配到的内容组合,就是我们访问的网址
    eg:
        本机运行Django程序,端口号8000,上述路由的访问网址就是
        '''http://127.0.0.1:8000/admin/'''
        
# Django二次追加斜杠机制
	当我们通过ip+端口号+admin去访问时,页面上显示我们能访问成功,但是当我们通过网页检查功能,会发现实际请求了两次,第一次用admin去请求,返回301,重定向,让前端去请求admin/,这时才请求成功
    '''
    此机制就是Django默认的机制,当你没加"/"访问时,Django会帮你加上"/",然后重定向到加了"/"的网页
    '''
    # 取消二次追加斜杠机制
    	settings.py中添加下面的代码
        APPEND_SLASH = False
       	'''可以取消,但是没必要,这个机制对于用户很友善'''
        
# 正则表达式该怎么写?
'''为了不出现用户输入吼住只要含有可匹配的内容就可以访问的现象,我们要限制用户输入的后缀必须和我们想要的一样,即限制头尾再匹配'''
	限制必须是开头:	^
    限制必须是结尾:	$
        
	小扩展:(主页面和尾页面)
        设置一个主页面,用户不输入任何后缀即可访问
        url(r'^$',views.home)
        设置尾页面,永辉输入没有对应关系的后缀访问
        url(r'.*',views.error)
     	'''
     	尾页要写到路由最后
     	路由的规则是从上往下找,找到符合的立刻执行并结束查找
     	.*万能匹配,写第一个后面的路由就执行不到了
     	'''
        

无名分组和有名分组

# 为什么会有无名分组和有名分组?
	这两个分组的起因是正则表达式的分组
    当我们对正则表达式进行分组后,括号里的正则就再是请求的后缀地址了,而是变成了请求的参数
    eg:
        url(r'^test/([0-9]{4})/$', views.test)
        我们用test/0000/来访问,虽然符合正则,但是还是访问不到我们的test接口,并且有以下报错:
        "test() takes 1 positional argument but 2 were given"
        test接口函数需要1个参数但是给了2个
        打印发现,第二个参数就是0000
        括号里的值变成了一个位置参数
        url(r'^test/(?P<id>[0-9]{4})/$', views.test)
        当我们给正则分组起别名,又发现第二个参数变成了一个关键字参数,接口必须定义一个名字为id的形参才能接收该参数
       
    '''上述特性Django称之为无名分组和有名分组'''
    
# 无名、有名分组的使用
	1. 重复使用
    url(r'^test/([0-9]{4})/([0-9]{4})/$', views.test)
    可以,接口需要再加两个位置参数
    url(r'^test/(?P<id>[0-9]{4})/(?P<nam>[0-9]{4})/$', views.test)
    也可以,接口需要加两个关键字参数,一个id= ,一个name=
    
    2. 混合使用
    url(r'^test/([0-9]{4})/(?P<id>[0-9]{4})/$', views.test)
    不可以,会报错
    
'''
拓展:
	在接口函数中,我们可以使用*args,**kwargs来接收两种分组的所有参数,不能混用,这样可以不用去关心到底有多少个分组
'''

反向解析

"""
a标签的href可以写网址的全称 也可以写后缀
	href='https://www.baidu.com'
	href='/login/'  # 自动补全当前服务的ip和port
    href='127.0.0.1:8000/login/'
"""
1.页面上有很多a标签链接了其他路由
2.路由匹配表达式出现了变化 html页面上的地址全部失效

# 反向解析
	通过反向解析可以获取到一个结果 该结果可以访问到一个路由
    即通过另一个方式访问到原路由,并拿到路由表达式
    
    1.给路由对应关系起别名
    url(r'^test/$', views.test, name = 'url_test')
    2.反向解析获取结果
    前端操作:
        href = "{% url 'url_test' %}"  # 可以跳转到test
    后端操作:
        from django.shortcuts import reverse
      	reverse('url_test')  # 可以访问到test
  
# 无名分组反向解析
	1.起别名 
    url(r'^test/([0-9]{4})/$', views.test ,name = 'no_name')
    2.反向解析
    前端操作:
        href = "{% url 'no_name' 0000 %}"  # 空格写参数
        
    后端操作:
        from django.shortcuts import reverse
      	reverse('no_name',args=(0000,))  # args元组里面写参数
  
# 有名分组反向解析
	1.起别名 
    url(r'^test/(?P<id>[0-9]{4})/$', views.test ,name = 'has_name')
    2.反向解析
    前端操作:
        href = "{% url 'no_name' 0000 %}" 
        href = "{% url 'no_name' id = 0000 %}" 
        
    后端操作:
        from django.shortcuts import reverse
      	reverse('no_name',args=(0000,))  
        reverse('no_name',kwargs={'id':0000}) 
        
"""
疑问:无名有名反向解析中的手动传值 这个值在实际工作中到底可以是什么
	一般情况下这个值可以是数据的主键值、页面的页码、区域的编号等
"""

路由分发

"""
如果一个django项目特别庞大 里面有很多应用 每个应用下有很多对应关系 
那么django自带的路由层里面的代码就会非常非常的多 如何优化???
	根据应用的不同拆分到不同的应用中

django支持每个应用都可以有自己独立的
		路由层、模板层、静态文件、视图层(默认)、模型层(默认)
		
上述特性能够让django在分组开发上更加的方便、快捷
	所有人都可以在应用中开发完整的项目功能
	最后汇总到一个空的django项目中 然后通过路由分发整合所有人的应用
"""
1.创建多个应用,并在配置文件中注册
INSTALLED_APPS = [
    'app01',
    'app02'
]

2.在多个应用中编写相同的路由
  urlpatterns = [
    url(r'^login/',views.login)
]
	urlpatterns = [
    url(r'^login/',views.login)
]
    
3.在总路由中做分发
from django.conf.urls import url, include
from app01 import urls as app01_urls
from app02 import urls as app02_urls

urlpatterns = [
    url(r'^app01/',include(app01_urls)),
  	url(r'^app02/',include(app02_urls))
]
"""总路由只负责分发 不负责视图函数对应"""
# 当你用app01/login/访问的时候,去到app01的login接口
# 当你用app02/login/访问的时候,去到app02的login接口
# 路由的分发其实就是加了个前缀,总路由控制只是哪个前缀来的去到哪个项目里面

  上述代码还可以简写
  from django.conf.urls import url, include
  url(r'^app01/',include('app01.urls')),
  url(r'^app02/',include('app02.urls'))

名称空间

同一个Django下的不同应用,当别名一样时,在反向解析的时候默认不会识别应用前缀,这样就会导致项目初选混乱

# 如何保证不出现上述问题
	1.添加名称空间
    	总路由中添加名称空间
        from django.conf.urls import url, include
      url(r'^app01/',include('app01.urls',namespace = 'app01')),
      url(r'^app02/',include('app02.urls', namespace = 'app02'))
        这时反向解析就会去对应项目下面找名字
        
   2.确保同一个Django下的名字不重复
posted @   程序猿伞兵一号  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示