22-接手Django老项目(下)-读懂urls路由树与架构脉络

文章目录

  • 接手Django老项目(下):读懂urls路由树------我不看代码先看路由
    • 导入语
    • [1 ~> 路由树的起点------`ROOT_URLCONF`](#1 ~> 路由树的起点——ROOT_URLCONF)
      • [1.1 找到根 URL 配置](#1.1 找到根 URL 配置)
      • [1.2 阅读根 urls.py](#1.2 阅读根 urls.py)
    • [2 ~> 逐层递归------画出完整的路由树](#2 ~> 逐层递归——画出完整的路由树)
      • [2.1 递归进去看子路由](#2.1 递归进去看子路由)
      • [2.2 手动画出路由树](#2.2 手动画出路由树)
    • [3 ~> 从 URL 反向推导业务逻辑------"URL → View → Model"法](#3 ~> 从 URL 反向推导业务逻辑——"URL → View → Model"法)
      • [3.1 逆推链路](#3.1 逆推链路)
      • [3.2 不需要读 100% 的代码](#3.2 不需要读 100% 的代码)
    • [4 ~> 中间件------请求在到达 View 之前经过了什么](#4 ~> 中间件——请求在到达 View 之前经过了什么)
    • [5 ~> 一个实用脚本------自动画出项目的 URL 树](#5 ~> 一个实用脚本——自动画出项目的 URL 树)
    • [思考 && 总结](#思考 && 总结)
    • 结尾

接手Django老项目(下):读懂urls路由树------我不看代码先看路由

📖 文章简介: 上篇讲完了环境复现------老项目终于能在本地跑起来了。下篇进入代码层面:面对一个没有文档的陌生 Django 项目,第一件事不是看 models,更不是看 views------而是看 urls.py 路由树。本文示范了一种"从外向内"的阅读方法:从 ROOT_URLCONF 开始,逐层递归画出路由树的完整结构,然后通过"URL → View → Model"的逆向链路快速定位核心业务。穿插真实经历------一个 CRM 系统通过路由树反向分析,发现 120 个 URL 中有 40 个已经废弃但仍然加载了对应的 views。


🎬 个人主页: 源码骑士

专栏传送门: 《Android开发基础》《python基础课程》

⭐️热衷从源码视角拆解技术底层原理,将复杂架构讲得通俗易懂


🎬 源码骑士的简介:

5年Android Framework系统开发经验,曾主导多项系统级性能优化专项

技术栈覆盖Android系统全链路(Binder/Handler/AMS/WMS/启动流程)及Java后端全家桶(Spring + MyBatis + Redis + Oracle)

累计产出原创技术文章100+篇,文章以源码拆解为特色,被读者评价为"看一篇胜过啃一周文档"


导入语

环境跑起来了,python manage.py runserver 成功输出 "Starting development server at http://127.0.0.1:8000/"。然后你打开浏览器访问,看到的是一个登录页。接下来怎么办?

大多数新手的做法是打开 views.py 开始从头读。这是效率最低的方式。一个中型 Django 项目可能有几十个 view 文件、几百个函数。从头读你会迷失在细节里,看不到整体结构。

我的做法是:先读路由树------URL 是 Django 项目的骨架,顺着它往下找肉。


1 ~> 路由树的起点------ROOT_URLCONF

1.1 找到根 URL 配置

python 复制代码
# settings.py 中通常有一行
ROOT_URLCONF = "myproject.urls"

这就是整个项目的根路由文件------myproject/urls.py。Django 收到任何 HTTP 请求后,首先进入这个文件进行 URL 匹配。

1.2 阅读根 urls.py

一个典型的根 urls.py 长这样:

python 复制代码
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/v1/", include("api.urls")),
    path("accounts/", include("accounts.urls")),
    path("dashboard/", include("dashboard.urls")),
    path("", include("frontend.urls")),
]

从这里你能立刻看出四个关键信息:

信息 来源 含义
项目分几个模块 include() 的个数 5 个模块(admin、api、accounts、dashboard、frontend)
哪个模块最大 include() 的参数 apiaccounts 等各是一个子目录
API 版本策略 URL 中的 v1/ 有一个 /api/v1/ 前缀 → 版本化 API
是否有前后端分离 frontend.urls 在根路径 有------前端路由挂载在 / 下面

2 ~> 逐层递归------画出完整的路由树

2.1 递归进去看子路由

python 复制代码
# api/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("users/", views.UserListView.as_view()),
    path("users/<int:pk>/", views.UserDetailView.as_view()),
    path("orders/", views.OrderListView.as_view()),
    path("orders/<int:pk>/", views.OrderDetailView.as_view()),
]

2.2 手动画出路由树

bash 复制代码
myproject.urls
├─ admin/
├─ api/v1/                    ← 包含 api.urls
│  ├─ users/                  → UserListView
│  ├─ users/<int:pk>/         → UserDetailView
│  ├─ orders/                 → OrderListView
│  └─ orders/<int:pk>/        → OrderDetailView
├─ accounts/                  ← 包含 accounts.urls(里面又有子路由)
├─ dashboard/                 ← 包含 dashboard.urls
└─ /                          ← 包含 frontend.urls

画完这张树最多花 15 分钟。但这 15 分钟让你对整个项目的入口有了透视图。 之后你去看任何一个 View,都知道它在全局中的位置------它是处理哪个 URL prefix 的、它前面经过了哪些中间件。

这个流程让我在那个 CRM 项目中快速定位到了一点:api/v1/reports/ 下有 40 个 URL pattern,但对应的 View 文件中只有 12 个实际被调用------28 个路由指向的 View 是 path() 自动生成的默认路由或者已经废弃的旧入口。


3 ~> 从 URL 反向推导业务逻辑------"URL → View → Model"法

3.1 逆推链路

bash 复制代码
URL pattern: /api/v1/orders/ → OrderListView

OrderListView 再往下看:
  queryset = Order.objects.filter(status="pending")
  → Model: Order(有一个 status 字段)
  → 业务含义: 这个接口返回所有 pending 状态的订单

3.2 不需要读 100% 的代码

对于一个陌生项目,你应该用 "20% 的 URL 理解 80% 的业务":

  • 先读 /admin/ → 看后台注册了哪些 Model → 了解核心数据表
  • 再读 /api/v1/ 下的所有路由 → 了解系统对外提供了哪些核心接口
  • 最后读 /accounts/ → 了解认证和权限体系

4 ~> 中间件------请求在到达 View 之前经过了什么

settings.pyMIDDLEWARE 列表的顺序决定了请求的处理顺序:

python 复制代码
MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
]

每个请求在到达 View 之前按这个顺序依次经过各中间件,响应时反过来。了解中间件链是理解请求处理流程的捷径。

Java Web 中 Filter 链的概念与此一致------请求按 web.xml 中 Filter 的声明顺序逐一过滤,再到 Servlet。Django 的中间件与之相似,但配置更简洁------全在 MIDDLEWARE 列表中。


5 ~> 一个实用脚本------自动画出项目的 URL 树

python 复制代码
# show_urls.py------用 Django 内置工具导出所有 URL
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
django.setup()

from django.urls import get_resolver

def print_url_tree(patterns, prefix=""):
    for pattern in patterns:
        if hasattr(pattern, "url_patterns"):
            print(f"{prefix}├─ {pattern.pattern}")
            print_url_tree(pattern.url_patterns, prefix + "│  ")
        else:
            print(f"{prefix}├─ {pattern.pattern} → {pattern.callback}")

resolver = get_resolver()
print_url_tree(resolver.url_patterns)

思考 && 总结

接手老项目的代码阅读三步法:

  1. settings.py 找到 ROOT_URLCONF → 进入根路由 → 递归展开所有 include() → 画出完整的 URL 树。
  2. 从 URL → View → Model 逆向追溯 → 只读核心 20% 路由对应的 View,快速把握系统业务逻辑。
  3. 中间件链是隐藏的关卡 → 认证、权限、CORS 全在这里处理,读懂它就明白了请求的全生命周期。

结尾

老项目入门上下篇完结。感谢阅读!

源码骑士 --- 源码级拆解,从底层看透技术

👀 关注:跟博主一起从源码视角深耕底层原理

❤️ 点赞:让优质内容被更多人看见

收藏:核心知识点存好,随用随查

💬 评论:分享你的经验或疑问,一起交流

🔄 一键四连:别忘了给博主一键四连!

🗡️ 寄语:路由树画完,心里才有地图。

结语:上下两篇加起来,从环境复现到代码理解,一套可复制的老项目接手流程。下篇深入 Django ORM 的性能杀手------N+1 查询问题。一键四连!

相关推荐
码云骑士43 分钟前
29-Python-logging日志模块-print不是日志的生产级实战
开发语言·python
2601_961963381 小时前
React对比Vue对比Angular:构建企业级合同签署平台深度评测
java·微服务·架构
王二端茶倒水1 小时前
智慧公寓网络运营:从入住开通到退租停用
运维·物联网·架构
Attachment George1 小时前
山东大学软件学院-项目实训-个人开发日志(十):材料问答链路开发——文档解析、OCR兜底与持续追问完善
python·ai·langchain·kotlin·rag
码云骑士1 小时前
24-Django请求全链路-WSGI到数据库响应的完整旅程
数据库·python·django
Swift社区1 小时前
AI 接管操作系统:鸿蒙 PC AI Native OS 架构揭秘
人工智能·架构·harmonyos
贺国亚1 小时前
06-奢侈零售VIP-Clienteling-Agent
开发语言·python·零售
knighthood20011 小时前
鸿蒙PC迁移:jieba 中文分词 Python 三方库鸿蒙PC适配全记录
python·中文分词·harmonyos
nix.gnehc1 小时前
Python 内存管理深度解析
开发语言·python