Skip to content

路由 URL configuration

路由定义

from django.urls import path, re_path


urlpatterns = [
    # 常规路由
    path('', views.index),

    # 正则路由  
    # (?P<phone_num>...)  Django 命名分组语法
    re_path(r'^phone/(?P<phone_num>1[3-9]\d{9})/$', views.phone_demo),
]

路径转换器(路由变量)

  • str - 匹配除了 '/' 之外的非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。
  • int - 匹配 0 或任何正整数。返回一个 int
  • slug - 匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签。比如,building-your-1st-django-site
  • uuid - 匹配一个格式化的 UUID 。为了防止多个 URL 映射到同一个页面,必须包含破折号并且字符都为小写。比如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID 实例。
  • path - 匹配非空字段,包括路径分隔符 '/' 。它允许你匹配完整的 URL 路径而不是像 str 那样匹配 URL 的一部分。
# urls.py
path(
        'example/<str:username>/<int:user_id>/<slug:article_slug>/<uuid:article_uuid>/<path:file_path>/',
        views.example_view,
        name='example_with_all_converters'
    )

# views.py
def example_view(request, username, user_id, article_slug, article_uuid, file_path):
    # 参数类型:
    # username: str
    # user_id: int
    # article_slug: str
    # article_uuid: UUID对象
    # file_path: str(可能包含斜杠)
    pass

反向解析

模板中使用路由

from django.urls import path

from . import views

urlpatterns = [
    # ...
    path("articles/<int:year>/", views.year_archive, name="news-year-archive"),
    # ...
]


<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

在Python中使用

from django.http import HttpResponseRedirect
from django.urls import reverse


def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse("news-year-archive", args=(year,)))

路由命名

  • 给路由起别名
# name=phone
re_path(r'^phone/(?P<phone_num>1[3-9]\d{9})/$', views.phone_demo,name=phone),

命名空间

# 在index.urls要指定app_namee
path('', include('index.urls', namespace='home')),

path('urlconf/', include(('uniform_resource_locator.urls', 'index'), namespace='index')),

命名空间的作用

  1. 避免命名冲突:当项目包含多个应用时,防止不同应用中出现同名的 URL 模式或模板文件
  2. 提高代码可维护性:明确指定资源所属的应用,使代码更清晰
  3. 支持应用复用:允许同一应用在项目中被多次使用(多个实例)

路由重定向


1、Django 如何处理一个请求

  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 )。视图会获得如下参数:
  5. 一个 HttpRequest 实例。
  6. 如果匹配的 URL 包含未命名组,那么来自正则表达式中的匹配项将作为位置参数提供。
  7. 关键字参数由路径表达式匹配的任何命名部分组成,并由 django.urls.path()django.urls.re_path() 的可选 kwargs 参数中指定的任何参数覆盖。
  8. 如果没有 URL 被匹配,或者匹配过程中出现了异常,Django 会调用一个适当的错误处理视图。参加下面的错误处理( Error handling )。