Django 中 URL 与视图函数:请求是如何一步步走到你代码里的
本文解析了Django框架处理URL请求的核心流程。首先介绍了URL的基本结构(协议、域名、路径等),然后详细拆解了Django的路由机制:从主路由文件urls.py加载urlpatterns,顺序匹配请求路径,命中后交由对应视图函数处理。视图函数必须接收request参数并返回HttpResponse对象。通过建立"URL→路由→视图→响应"这条完整链路,开发者可以清晰理解请
关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集
很多人第一次写 Django 时,都会有一个相似的困惑:
浏览器里输入一个地址, Django 到底是怎么知道该执行哪段代码的?
这一节课,核心只做一件事:把 URL → 路由 → 视图函数 → 响应 的整条链路拆开来看清楚。
理解这一条链,后面无论你写接口、做自动化测试、看线上 404,都不会再“靠猜”。

一、URL 到底是什么?不是 Django 专属的概念
先把 Django 放一边,URL 本身是一个计算机科学里的老概念。
URL(Uniform Resource Locator),统一资源定位符。 翻译成人话就是:
浏览器地址栏里的那串东西,用来标识“某个资源在什么位置”。
你在浏览器里敲下一个地址,本质是在说:
-
我要用什么协议
-
去找哪台机器
-
访问它的哪个资源
-
顺便带点额外信息
二、把 URL 一次拆干净
一个完整的 URL,结构大致是:

协议://host:端口/path?query#fragment
1. 协议(protocol)
协议决定了通信方式。
常见的只有几个:
-
http:明文传输 -
https:加密传输 -
file:访问本地文件
在 Django 开发中,有一个非常重要的工程现实:
Django 主要关心 HTTP,HTTPS 通常交给 Nginx 处理。
也就是说:
-
Django 负责业务逻辑
-
HTTPS 的证书、加密、解密,基本不在 Django 层解决
2. host name:域名或 IP
host name 指的是:
-
域名(如
www.xxx.com) -
或 IP(如
127.0.0.1)
开发阶段最常见的是:
127.0.0.1
在公司里,一定会变成域名。
这里有一个很多人早期模糊的点:
浏览器并不是“认识域名”,它最终只认 IP。
所以真实流程是:
-
浏览器拿到域名
-
通过 DNS 服务解析成 IP
-
再去网络中找对应的那台机器
3. 端口(port)
端口是服务监听的入口。
-
HTTP 默认走
80 -
HTTPS 默认走
443
当端口是默认值时,浏览器地址栏不会显示。
所以:
http://xxx.com
本质等价于:
http://xxx.com:80
而像 Django 开发时常见的:
127.0.0.1:8000
是因为你监听的不是 80 端口,就必须显式写出来。
4. 路由(path):真正定位资源的关键
前面的协议、域名、端口,只是找到服务器。
真正告诉服务器:
“我要你这里的哪一份资源”
靠的是 path。
例如:
/news/2024/xxx/
如果服务器里没有对应的 path,结果通常只有一个:
404
这和 Django 无关,是 Web 世界的基本规则。
5. 查询字符串(query)
查询字符串是 path 后面、问号开始的部分:
?key=value&key2=value2
它的作用只有一个:
向服务端传递额外信息,用来更精确地描述资源。
例如某个视频地址:
-
视频 ID
-
菜单类型
-
版本号
这些参数是否有意义,完全由后端决定。
6. 锚点(fragment)
锚点以 # 开头:
#section-1
它的作用是:
-
定位到当前页面的某个位置
-
类似书签
这是前端行为,不会发给服务器。 在 Django 后端课程里,知道它的存在即可。
三、浏览器回车后,Django 做了什么?
现在我们回到 Django。
当你在浏览器里输入一个 URL 并回车,Django 的处理流程是非常“死板且可预测”的。
第一步:找主路由文件
Django 会先去配置里找一个东西:
ROOT_URLCONF
默认指向:
项目同名目录/urls.py
也就是我们常说的主路由文件。
第二步:加载 urlpatterns
Django 会加载 urls.py 里的一个变量:
urlpatterns = [
...
]
这是一个列表,里面存的是 Django 能接受的所有路由规则。
第三步:从上到下逐个匹配
这是一个非常关键、也非常“工程化”的点:
Django 是从上到下,顺序匹配路由的。
-
匹配到第一个符合的
-
立刻停止
-
把请求交给对应的视图函数
如果整个列表都没匹配上:
返回 404
没有“智能兜底”,没有“模糊匹配”。
第四步:把请求交给视图函数
例如你配置了这样一条路由:
path("配置/2003/", views.config_2003_view)
当请求命中这条规则时:
-
Django 不再管 URL
-
直接把请求对象交给
config_2003_view
接下来发生什么,全看你这个函数怎么写。
四、视图函数:Django 里真正干活的地方

视图函数在 Django 里,本质就是一个普通 Python 函数,但有两条硬性规则。
1. 第一个参数必须是 request
def my_view(request):
...
这个 request 是 Django 传进来的 HTTP 请求对象。
-
URL
-
请求方式
-
参数
-
头信息
都在它里面。
2. 必须返回 HttpResponse 对象
视图函数不能随便 return 一个字符串。
正确做法是:
from django.http import HttpResponse
def my_view(request):
return HttpResponse("hello django")
原因很简单:
Django 需要一个“标准化的 HTTP 响应对象”, 才知道怎么回给浏览器。
五、视图函数一般写在哪?
在一个标准 Django 项目里:
视图函数通常写在
views.py文件中。
例如:
项目同名目录/
views.py
示例:
from django.http import HttpResponse
def config_2003_view(request):
html = "<h1>配置 2003 页面</h1>"
return HttpResponse(html)
六、路由与视图函数如何绑定?
绑定发生在主路由文件 urls.py 中。
核心步骤只有三步:
-
导入视图函数
from . import views
-
在
urlpatterns中写 path
path("配置/2003/", views.config_2003_view)
注意一个细节:
视图函数名后面不要加括号。
你传的是函数本身,而不是函数执行结果。
-
浏览器访问测试
http://127.0.0.1:8000/配置/2003/
如果页面能正常显示内容,说明:
-
URL → 路由
-
路由 → 视图函数
-
视图函数 → 响应
整条链路已经打通。
七、把这条链路记成一张“心智模型”
到这里,其实可以用一句话总结 Django 的基础运行逻辑:
浏览器发 URL → Django 找主路由 → 顺序匹配 urlpatterns → 命中后交给视图函数 → 视图函数返回 HttpResponse → 浏览器展示结果
这条链路一旦建立起来,后面:
-
接口参数从哪来
-
为什么 404
-
为什么视图函数没被执行
-
自动化测试该 mock 哪一层
都会变得非常清晰。
URL 和视图,是 Django 的“最小闭环”
很多框架概念学起来感觉很重,但 URL + 视图函数,其实是 Django 的最小工作单元。
只要你掌握了:
-
URL 的组成
-
Django 路由的匹配机制
-
视图函数的输入与输出约束
你就已经能写出一个完整、可运行、可测试的 Web 功能。
后面无论是模板、ORM、中间件, 都只是这条主链路上的“增强模块”。
下一步,才是真正开始把 Django 当工程来用。
关于我们
霍格沃兹测试开发学社,隶属于 测吧(北京)科技有限公司,是一个面向软件测试爱好者的技术交流社区。
学社围绕现代软件测试工程体系展开,内容涵盖软件测试入门、自动化测试、性能测试、接口测试、测试开发、全栈测试,以及人工智能测试与 AI 在测试工程中的应用实践。
我们关注测试工程能力的系统化建设,包括 Python 自动化测试、Java 自动化测试、Web 与 App 自动化、持续集成与质量体系建设,同时探索 AI 驱动的测试设计、用例生成、自动化执行与质量分析方法,沉淀可复用、可落地的测试开发工程经验。
在技术社区与工程实践之外,学社还参与测试工程人才培养体系建设,面向高校提供测试实训平台与实践支持,组织开展 “火焰杯” 软件测试相关技术赛事,并探索以能力为导向的人才培养模式,包括高校学员先学习、就业后付款的实践路径。
同时,学社结合真实行业需求,为在职测试工程师与高潜学员提供名企大厂 1v1 私教服务,用于个性化能力提升与工程实践指导。
更多推荐



所有评论(0)