Skip to content

路由层 URLConf

路由的作用,是决定“一个请求该交给哪个视图处理”。

为什么需要路由

浏览器访问网站时,请求的只是一个 URL,例如:

text
/users/
/articles/
/login/

Django 必须知道:

  • /users/ 该交给哪个函数处理
  • /articles/ 该交给哪个函数处理

这件事就是路由在做。

最基础的路由配置

urls.py

python
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("hello/", views.hello),
]

视图:

python
from django.http import HttpResponse

def hello(request):
    return HttpResponse("你好,Django")

当你访问:

text
http://127.0.0.1:8000/hello/

页面就会显示:

text
你好,Django

路由匹配

路由本质上就是“路径匹配规则”。
如果路径匹配成功,请求就会进入对应视图。

路由参数

有些页面不是固定路径,而是带参数,例如文章详情页:

python
path("article/<int:article_id>/", views.article_detail)

视图中:

python
def article_detail(request, article_id):
    return HttpResponse(f"文章编号是:{article_id}")

访问:

text
/article/12/

页面会显示:

text
文章编号是:12

自定义转换器

默认常见转换器有:

  • str
  • int
  • slug
  • uuid

它们的作用,是限制 URL 参数的格式。

路由分级

项目变大后,通常不会把所有路由都写在一个文件里,而是按 app 拆开。

主路由:

python
from django.urls import path, include

urlpatterns = [
    path("users/", include("users.urls")),
]

这样结构会更清晰。

重定向

有时一个页面不再直接显示内容,而是跳转到另一个地址:

python
from django.shortcuts import redirect

def old_page(request):
    return redirect("/new-page/")

静态文件

路由学到后面,你会碰到静态文件访问问题,例如:

  • 图片
  • CSS
  • JS

这些资源通常不会走普通业务路由,但你必须知道它们和页面路由是两回事。

学这一页的目标

  • 看懂一条路由是怎么写的
  • 会把路径绑定到视图
  • 会接收路径参数
  • 知道大项目里为什么要拆分路由

Built with VitePress.