Django REST Framework(十四)路由Routes

路由定义规则

Django 的路由系统(URLconf)用于将 URL 映射到相应的视图函数或类。以下是 Django 中常见的路由定义规则:

Django 路由定义

在 Django 中,路由定义通常在应用的 urls.py 文件中进行。基本的路由配置如下:

# project/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include('app.urls')),
]

app/urls.py 文件中定义应用的具体路由:

# app/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('detail/<int:id>/', views.detail, name='detail'),
]

路由变量的设置

在路由中,可以通过尖括号 < > 来捕获 URL 中的变量,并传递给视图函数。例如:

path('articles/<int:year>/', views.year_archive, name='year-archive')

在上述路由中,<int:year> 捕获了 URL 中的整数部分,并将其作为 year 参数传递给 year_archive 视图函数。

常用的变量类型包括:

  • str:匹配任何非空字符串,不包含斜杠。默认类型。
  • int:匹配 0 或正整数。
  • slug:匹配任意字母数字以及连字符和下划线的组合。
  • uuid:匹配一个格式化的 UUID。
  • path:匹配任意非空字符串,可以包含斜杠。
正则表达式的路由定义

在 Django 2.0 之前,路由是通过正则表达式定义的。虽然现在推荐使用 path() 方法,但仍然可以使用 re_path() 方法定义复杂的路由。

from django.urls import re_path

urlpatterns = [
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive, name='year-archive'),
]

上述路由使用正则表达式捕获 URL 中的年份部分,并作为 year 参数传递给视图函数。

命名空间与路由命名

为了更好地管理和组织路由,Django 提供了命名空间和路由命名的功能。

命名空间 namespace

命名空间用于区分不同应用的路由,避免命名冲突。在主 urls.py 文件中,可以为每个应用分配一个命名空间:

# project/urls.py
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include('app.urls', namespace='app')),
]

在应用的 urls.py 文件中,需要声明应用的命名空间:

# app/urls.py
app_name = 'app'

urlpatterns = [
    path('', views.index, name='index'),
    path('detail/<int:id>/', views.detail, name='detail'),
]

这样,可以通过命名空间来引用具体的路由,例如:app:indexapp:detail

路由命名 name

命名路由使得在模板中引用和反向解析 URL 变得更加容易。每个路由都可以通过 name 参数来命名:

path('articles/<int:year>/', views.year_archive, name='year-archive')

在模板中,可以通过 {% url 'year-archive' year=2023 %} 来生成对应的 URL。

路由的使用方式

在模板中使用

在 Django 模板中,可以使用 {% url %} 模板标签来生成 URL。这对于动态生成链接特别有用。

<a href="{% url 'detail' id=article.id %}">View Details</a>

上述代码生成了指向某篇文章详细信息的链接,其中 article.id 是视图中传递给模板的变量。

反向解析 reverse 与 resolve

Django 提供了 reverse 函数,用于在视图或其他 Python 代码中生成 URL。

from django.urls import reverse

def my_view(request):
    url = reverse('year-archive', args=[2023])
    return HttpResponseRedirect(url)

reverse 函数可以根据路由的名称和参数生成对应的 URL。

同样,resolve 函数可以将一个 URL 解析为相应的视图函数。

from django.urls import resolve

match = resolve('/articles/2023/')
print(match.view_name)  # 输出:'year-archive'

路由重定向 redirect

在某些情况下,需要将请求重定向到另一个 URL。Django 提供了 redirect 函数来实现这一功能。

from django.shortcuts import redirect

def my_view(request):
    return redirect('year-archive', year=2023)

也可以通过 URL 路径进行重定向:

def my_view(request):
    return redirect('/articles/2023/')

重定向可以使用在视图函数中,以便在特定条件下将用户引导到另一个页面。

总结

Django 的路由系统提供了灵活而强大的 URL 映射机制,使得开发者可以方便地定义和管理项目中的路由。通过使用命名空间、命名路由、模板中的 URL 生成、反向解析和路由重定向,开发者可以有效地组织和控制应用中的 URL 和视图之间的关系

  • 25
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjjpp2301

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值