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下的名字不重复
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统