必备知识点 路由
django必备知识点 路由
1.Django生命周期请求流程图
- 浏览器>>
- 发送请求(Http请求) >>
- web服务网关接口(django默认的wsgiref模块不能承受高并发,最大只有1000左右) >>
- 中间件 >> 缓存数据库(返回给中间件已经缓存过的数据) >>
- urls.py(路由层) >>
- views.py(视图层) >>
- templates(模板层:存放html静态文件) models.py(模型层:存放假架接数据库)>>
- 数据库(返回给模型层需要的数据)
2.什么是URL配置(URLconf)
- URL调度器 | Django 文档 | Django (djangoproject.com)
- URL配置(URLconf)就像Django 所支撑网站的目录。
- 它的本质是URL与要为该URL调用的视图函数之间的映射表。
- 你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
2.1 传统路由
- 要从 URL 中取值,使用尖括号。
- 捕获的值可以选择性地包含转换器类型。比如,使用
<int:nid>
来捕获整型参数。如果不包含转换器,则会匹配除了/
外的任何字符。 - 这里不需要添加反斜杠,因为每个 URL 都有。比如,应该是
article
而不是/article
- 除了int,还有以下类型:
- int,整数
- str,字符串 /
- slug,字母+数字+下滑线+-
- uuid,uuid格式
- path,路径,可以包含 /
2.2 无名分组和无名分组
2.2.1 无名分组
re_path(r"^del/(\d+)/")
# 前端路由访问 http://127.0.0.1:8000/del/1/
# 后端
def del(request,id, *args, **kwargs):
# 有一个位置参数会接收到 前端路由地址中的参数 1
print(id)
print(args) # ('1',)
print(kwargs)
return HttpResponse("del_book")
2.2.2 有名分组
# 路由语法
re_path(r"^del/(?P<year>\d+)/") # 匹配到任意数据 ---> 用 year关键字接收到
# 前端路由访问 http://127.0.0.1:8000/del/1/
# 后端
def del(request,year, *args, **kwargs):
# 上面的位置参数必须跟 url 里面的正则匹配的变量名一致
# 如果你不跟路由一样,会报错,提示缺少一个必要的位置参数
print(year)
print(args)
print(kwargs) # {'year': '1'}
return HttpResponse("del_book_one")
2.2.3 有名分组和无名分组混用
# 无名有名混合使用
re_path(r'^index/(\d+)/(?P<year>\d+)/', views.index),
# 前端访问 http://127.0.0.1:8000/del_two/1/2/
# 后端只会接收到有名分组而无法接收到无名分组
# 结论就是:不能混用
2.3 请求示例
-
http://localhost:8000/article/?nid=199,django会匹配到 路径 path('article/', views.article),拿到nid值并打印
-
http://localhost:8000/news/12/,django会匹配到 news/
<int:nid>
/ 拿到nid的值并打印 -
urls.py
from django.contrib import admin
from django.urls import path
from apps.web import views
urlpatterns = [
path('news/<int:nid>/', views.news),
path('article/', views.article),
]
- Views.py
def news(request, nid):
print(nid)
return HttpResponse("新闻")
def article(request):
nid = request.GET.get("nid")
print(nid)
return HttpResponse("文章")
3. 路由分发
由于Django项目会创建很多app,一旦多起来看这很嘈杂,然后我们就可以使用include进行路由拆分,创建多个app,统一放在apps文件夹下,每个app各自创建一个urls.py文件
3.1 include分发
include
用于包含其他 URL 配置。这样可以将一个大的 URL 配置拆分成多个小的配置文件,提高可读性和维护性。
- api/web两个app
- api app
# api/urls.py
from django.urls import path
from apps.api import views
urlpatterns = [
# auth
path('auth/', views.auth),
# login
path('login/', views.login)
]
# api/views.py
from django.shortcuts import render, HttpResponse
def auth(request):
return HttpResponse("Hello, world. You're at the")
def login(request):
return HttpResponse("Hello, world. You're")
- web app
# web/urls.py
from django.urls import path
from apps.web import views
urlpatterns = [
# news
path('home/', views.home),
# article
path('article/', views.article)
]
# web/views.py
from django.shortcuts import render, HttpResponse
def home(request):
return HttpResponse("主页")
def article(request):
return HttpResponse("文章")
- 根目录 urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('api/', include('apps.api.urls')),
path('web/', include('apps.web.urls')),
]
- 根据根目录的路径前缀,api/或者web/ 找到对应的app,从而找到相对应的路径
3.2 手动路由分发,可以与app无关
path('user/add/', views.login),
path('user/delete/', views.login),
path('user/edit/', views.login),
path('user/list/', views.login),
path('user/', ([
path('add/', views.login),
path('delete/', views.login),#/user/delete/
path('edit/', views.login),
path('list/', views.login),
], None, None)),
纯粹帮助提取功能的URL,防止重复编写。
3.3 路由分发的本质
- url对应函数
path(api/auth/',views.api.auth)
- url对应元祖
# include返回的是个元祖
path('api/auth',include([] None None))
4. 反向解析 name,reverse
4.1 反向解析的本质
- 先给路由起一个别名,然后,通过一些方法去解析别名,可以得到这个别名对应的路由地址
- 先给路由与视图函数起一个别名
path('auth/', views.auth, name="V1"),
4.2. 后端反向解析
from django.urls import reverse
# urls.py
urlpatterns = [
# auth
path('auth/', views.auth, name='v2'),
# login
path('login/', views.login, name="V1")
]
# views.py
def login(request):
url = reverse("v2")
return redirect(url)
4.3 前端反向解析
<a href="{% url 'v2' %}">111</a>
4.4 无名分组的反向解析
- 有名分组和无名分组的反向解析是一样的
- 有名分组是用kwargs参数,无名用args
# 后端
reverse("路由映射的别名",args=(额外的参数,))
# 前端
<a href="{% url '路由映射的别名' 额外的参数 %}">跳转链接</a>
5.名称空间 namespace
- 当多个应用出现相同的别名,反向解析不会自动识别应用前缀
- 正常情况下的反向解析是不能识别前缀的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!