本节摘要:URL 路由把"地址"映射到"处理函数"。本节讲清 urls.py 的写法、视图函数的三种返回(页面、JSON、重定向)、路径参数与查询参数的处理,以及"URL 是接口设计"的核心理解。
阅读完本节,你应当能够:
"访问 /hello 为什么显示内容?"——因为 urls.py 里写了映射:路径 /hello → 视图函数 hello。路由是"地址簿",视图是"处理员"。配置一个路径、写一个函数,页面就出来了。
路由视图的分工:
# urls.py from django.urls import path from . import views urlpatterns = [ path("hello/", views.hello), path("users/<int:pk>/", views.user_detail), ]
# views.py def hello(request): return HttpResponse("Hello, Django!") def user_detail(request, pk): return JsonResponse({"id": pk, "name": "张三"})
| 返回 | 场景 |
|---|---|
| HttpResponse | 文本/页面 |
| JsonResponse | API 数据 |
| redirect | 跳转 |
💡 关键直觉:URL 是接口的"门牌号"——路径设计(/users/1 而非 /getUserById)本身就是 RESTful 实践。先设计 URL,再写视图。
| 参数 | 写法 | 例子 |
|---|---|---|
| 路径参数 | int:pk | /users/1 |
| 查询参数 | request.GET | ?page=1 |
⚠️ 常见坑:路径参数类型不声明。不写 int:pk 而写 ,参数会当字符串处理——声明类型(int/str)让代码更严谨。
接口会写了,下一节接数据——数据库与 ORM。
Q1:路由(URLconf)为什么重要?
因为 URL 是用户(或前端)访问应用的唯一入口,路由配置就是"地址到处理函数的映射表"。路由设计得好,接口自然清晰易用;路由混乱,访问路径毫无规律,前端和后端就要反复对接口。实践原则:先设计好 URL 结构,再写视图。比如用户相关的接口统一用 /users/ 开头,id 用路径参数 /users/1/,语义明确。
Q2:路径参数和查询参数怎么区分?
路径参数是 URL 路径里的一部分:/users/1/ 里的 1,适合定位单个资源;查询参数在问号后面:/users/?page=2 里的 page=2,适合筛选、分页。Django 里路径参数在路由里用尖括号声明(比如 int:pk),查询参数在视图里通过 request.GET 读取。两者的选型原则和第 2 章讲的一致:定位用路径参数,筛选用查询参数。
Q3:视图函数为什么必须接收 request 参数?
因为 request 对象装着本次请求的所有信息:路径、方法(GET/POST)、请求头、查询参数、请求体、用户会话等。视图从 request 里读输入,处理后通过返回值产生输出。它是请求在 Django 里的"档案袋"。理解了 request,你就理解了"视图是处理请求的函数"这句话——每次请求进来,框架构造一个 request 对象传给视图,视图用完后返回响应。
Q4:HttpResponse、JsonResponse、redirect 分别什么时候用?
HttpResponse 返回一段文本或 HTML(比如普通页面、文本接口);JsonResponse 返回 JSON 数据(前后端分离的 API 首选);redirect 是 302 跳转(比如登录后跳到首页)。判断依据是"你要返回什么给调用方":数据给前端解析用 JsonResponse,页面给浏览器渲染用 HttpResponse,要求浏览器跳到别处用 redirect。
动手建议:把路由和视图练熟,用三种返回类型各写一个接口:一个返回纯文本,一个返回 JSON(可以查数据库),一个做重定向。然后分别用浏览器和接口测试工具访问,观察响应内容区别。再尝试定义带路径参数的路由(比如 /users/int:pk/),访问不同 id 观察参数是否正确传入。路由和视图是 Django 接口开发的门面,这块练扎实,后面接数据、接后台都顺理成章。
本节练习的目标,是把路由配置和视图返回练熟。步骤如下:
第一步,配置基础路由。把"首页"路径映射到一个返回欢迎文本的视图。访问该路径,看到文本。验收标准:路径、视图、文本三者对应无误。
第二步,配置带参数的路由。定义一条形如 /articles/3 的路径,把数字部分作为路径参数传给视图,视图返回"你访问的文章编号是 3"。分别访问不同编号,观察结果随之变化。验收标准:路径参数正确传递。
第三步,返回 JSON 数据。写一个视图,返回一个字典结构的数据(比如用户名、年龄)。访问后确认响应是 JSON 格式。验收标准:浏览器或接口工具能看到 JSON。
第四步,使用查询参数。写一个视图,从请求对象里读取查询参数(比如 page),把它的值返回。访问带问号参数的路径,观察取值。验收标准:查询参数正确读取。
第五步,做重定向。写一个视图,访问它时跳转到首页。访问测试,确认浏览器地址栏跳转。验收标准:跳转行为符合预期。
第六步,故意写错。把路径参数类型声明去掉,或者把路由顺序搞乱,观察行为变化或报错,理解"类型声明"和"路由顺序"的作用。修复后再确认正常。验收标准:你能从现象中解释原因。
六步走完,路由和视图的常见玩法你就都练过了。之后写任何 Django 接口,都是在这套基础上组合。
路由是门牌号,视图是处理员,参数是传话的纸条。路径参数、查询参数、JSON 返回、重定向都亲手试一遍,路由视图这块就扎实了。