Django - 路由

  • 为了给一个应用设计 URL,你需要创建一个 Python 模块,通常被称为 URLconf (URL configuration)。这个模块是纯粹的 Python 代码,包含 URL 模式(简单的正则表达式)到 Python 函数(你的视图)的简单映射。
  • 映射可短可长,随便你。它可以引用其它的映射。而且,因为它是纯粹的 Python 代码,它可以动态构造。
  • Django 还提供根据当前语言翻译 URL 的一种方法。更多信息参见 国际化文档

当一个用户请求 Django 站点的一个页面,下面是 Django 系统决定执行哪个 Python 代码使用的算法:

  1. Django 确定使用根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但如果传入 HttpRequest 对象拥有 urlconf 属性(通过中间件设置),它的值将被用来代替 ROOT_URLCONF 设置。
  2. Django 加载该 Python 模块并寻找可用的 urlpatterns 。它是 django.urls.path() 和 (或) django.urls.re_path() 实例的序列 (sequence)。
  3. Django 会按顺序遍历每个 URL 模式,然后会在所请求的 URL 匹配到第一个模式后停止,并与 path_info 匹配。
  4. 一旦有 URL 匹配成功,Djagno 导入并调用相关的视图,这个视图是一个 Python 函数(或基于类的视图 class-based view)。视图会获得如下参数:
    • 一个 HttpRequest 实例。
    • 如果匹配的 URL 包含未命名组,那么来自正则表达式中的匹配项将作为位置参数提供。
    • 关键字参数由路径表达式匹配的任何命名部分组成,并由 django.urls.path()django.urls.re_path() 的可选 kwargs 参数中指定的任何参数覆盖。
  5. 如果没有 URL 被匹配,或者匹配过程中出现了异常,Django 会调用一个适当的错误处理视图。参加下面的错误处理 ( Error handling )。

示例:

1
2
3
4
5
6
7
8
9
10
from django.urls import path

from . import views

urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

注意:

  • 要从 URL 中取值,使用尖括号。
  • 捕获的值可以选择性地包含转换器类型。比如,使用 <int:name> 来捕获整型参数。如果不包含转换器,则会匹配除了 / 外的任何字符。
  • 这里不需要添加反斜杠,因为每个 URL 都有。比如,应该是 articles 而不是 /articles

下面的路径转换器在默认情况下是有效的:

  • str - 匹配除了 '/' 之外的非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。
  • int - 匹配 0 或任何正整数。返回一个 int
  • slug - 匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签。比如,building-your-1st-django-site
  • uuid - 匹配一个格式化的 UUID 。为了防止多个 URL 映射到同一个页面,必须包含破折号并且字符都为小写。比如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID 实例。
  • path - 匹配非空字段,包括路径分隔符 '/' 。它允许你匹配完整的 URL 路径而不是像 str 那样匹配 URL 的一部分。
  • 如果路径和转化器语法不能很好的定义你的 URL 模式,你可以可以使用正则表达式。如果要这样做,请使用 re_path() 而不是 path()
  • 在 Python 正则表达式中,命名正则表达式组的语法是 (?P<name>pattern) ,其中 name 是组名,pattern 是要匹配的模式。
  • 示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from django.urls import path, re_path

    from . import views

    urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
    ]

主 / 子路由

  • 主路由

    项目同名目录下的 urls.py 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    """day_01 URL Configuration

    The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
    Examples:
    Function views
    1. Add an import: from my_app import views
    2. Add a URL to urlpatterns: path('', views.home, name='home')
    Class-based views
    1. Add an import: from other_app.views import Home
    2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
    Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path, include

    urlpatterns = [
    path("admin/", admin.site.urls),
    # 通过include指定子路由
    path("user/", include("user.urls")),
    path("goods/", include("goods.urls")),
    ]

  • 子路由

    应用目录下自己手动创建的 urls.py 文件

    • user 应用

      1
      2
      3
      4
      5
      6
      7
      8
      9
      from django.urls import path

      from user import views

      urlpatterns = [
      path("", views.index),
      path("test/", views.test),
      ]

      访问:http://127.0.0.1:8000/user/test/

    • goods 应用

      1
      2
      3
      4
      5
      6
      7
      8
      9
      from django.urls import path

      from goods import views

      urlpatterns = [
      path("", views.index),
      path("all/", views.show_goods),
      ]

      访问:http://127.0.0.1:8000/goods/all/

  • 介绍

    URL 命名空间允许你使用唯一的反向命名 URL 模式( named URL patterns ),即便不同应用程序使用相同的 URL 名称。对于第三方应用程序来说,始终使用 URL 命名空间是个好习惯(像在教程里说的那样)。同样,如果已部署了应用程序的多个实例,它也允许你反向解析 URL。换句话说,因为单个应用的多个实例会分享已命名的 URL,命名空间提供了区分这些已命名 URL 的方法。

  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # urls.py

    from django.contrib import admin
    from django.urls import path, include

    urlpatterns = [
    path("admin/", admin.site.urls),
    path("user/", include("user.urls", namespace="suer")),
    path("goods/", include("goods.urls", namespace="goods")),
    ]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # goods/urls.py

    from django.urls import path

    from goods import views

    app_name = "goods"
    urlpatterns = [
    path("", views.index),
    path("all/", views.show_goods, name="all"),
    path("all1/", views.show_goods1, name="all1"),
    path("myreverse/", views.my_redirect, name="myreverse")
    ]

------------- 本文结束 感谢您的阅读 -------------
正在加载今日诗词....