必备知识点 路由

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 请求示例

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

  • 当多个应用出现相同的别名,反向解析不会自动识别应用前缀
  • 正常情况下的反向解析是不能识别前缀的
posted @ 2024-03-28 19:56  Formerly0^0  阅读(2)  评论(0编辑  收藏  举报