【2022.9.1】Django框架
学习内容概要
- Django请求生命周期流程图
- 路由系统
- 路由匹配
- 无名分组
- 有名分组
- 反向解析
- 路由分发
- 名称空间
内容详细
Django请求生命流程图
路由匹配
# '网址后缀',函数名
path('index/',views.index)
"""
在浏览器页面输入网址 一旦后缀匹配上后会就执行后面的函数功能
并结束整个路由的匹配
"""
-
1.路由结尾的斜杠(/)
- 一般在Django中的urls.py中(路由层)写网址后缀时
- 默认情况下 不写斜杠 Django会做二次处理
- 第一次匹配不到该网址后缀 会让浏览器加上斜杠再次的请求一次
- 总结:在urls中写网址后缀 加斜杠或不加斜杠 不会影响浏览器访问的该网址(Django会二次请求)
- 直男要求:要求一丝不苟
- django配置文件中可以指定是否自动添加斜杠
- 在settins.py中加上 APPEND_SLASH = False 配置就限制了Django自动添加斜杠的功能
-
2.path转换器
-
2.1 当网址后缀不固定的时候 可以使用转换器
# 转换器可以转换类型及用法 'int': IntConverter(), 'path': PathConverter(), 'slug': SlugConverter(), 'str': StringConverter(), 'uuid': UUIDConverter(),
-
2.2 转换器匹配到的内容会当做视图函数的关键字参数传入
-
2.3 转换器有几个叫什么名字 那么视图函数的形参必须对应
-
-
3.re_path 正则匹配
- re_path(正则表达式,函数名)
- 一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数
- 并结束整个路由的匹配
- re_path('^test/$', views.test)(这样确定好开头和结尾就必须是inner才可以访问了)
-
4.正则匹配之无名分组
re_path('^test/(\d+)/', views.test) # 正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数 写 views 中 代码: def test(request,a): print(a) return HttpResponse('test')
-
5.正则匹配之有名分组
re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test) # 正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数 # 写 views 中 代码: def test(request,year,others): print(a,b) return HttpResponse('test')
-
6.django版本区别
- 在django1.11中 只支持正则匹配 并且方法是 url()
- django2,3,4中 path() re_path()
- re_path() 等价于django1.11中 url()
反向解析
- 推导:
- 因为在urls页面上会提前写死很多的路由 一旦路由发生变化 会导致所有页面相关链接失效
- 为了防止出现该问题 我们需要使用反向解析
"""
反向解析的本质就是:在随便改变路由的情况下 返回一个结果 该结果可以访问到对应的路由
"""
1.路由对应关系起别名
# 在url页面操作
path('register/', views.reg, name='reg_view')
# 然后改动 HTML 页面上a标签里的网址链接
href="{% url 'reg_views' %}"
2.使用反向解析语法
# 后端 在views页面调内置模块
from django.shortcuts import reverse
(reverse('reg_views'))
PS:反向解析的操作在
path() re_path() rl() 都是一样的
有名无名反向解析
path('reg/<str:info>/', views.reg, name='reg_view')
当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值
# 前端
reverse('reg_view', args=('jason',))
# 后端
{% url 'reg_view' 'jason' %}
路由分发
- 1.Django中的应用都可以有自己的独立配置文件夹
- urls.py
- templates 文件夹
- static 文件夹
# 这样基于Django开发的多个应用完全独立
# 结耦合度高 效率高 便于小组开发
# 子路由(app01\urls.py、app02\urls.py)
path('after/', views.after) # app01
path('after/', views.after) # app02
# 总路由(urls.py 写入)
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls')),
名称空间
有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
解决方式1
名称空间
namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
解决方式2
别名不冲突即可
"""
保证django项目下没有重复的别名即可
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)