Django URL 的注册与请求处理流程

在学习 Django 开发时,很多同学会有这样的疑问:

浏览器发起一个请求后,Django 是如何一步步找到对应的视图函数并返回响应的?

本文将带你完整梳理 Django URL 的注册与请求处理流程,让你彻底搞清楚请求从浏览器进入到最终返回结果的全过程。


1. 请求整体处理流程

先看一个 请求执行链路图 (以访问 /hello/ 为例):

python 复制代码
浏览器 (Client)
     │
     ▼
HTTP 请求 (GET /hello/)
     │
     ▼
WSGI/ASGI Server (Gunicorn / Uvicorn)
     │
     ▼
Django Handler (WSGIHandler / ASGIHandler)
     │  调用 get_response(request)
     ▼
URL Resolver (基于 ROOT_URLCONF 的 urlpatterns)
     │
     ├─ 匹配 URLPattern: path("hello/", views.hello_view)
     ▼
视图函数 (views.hello_view)
     │  处理请求,返回 HttpResponse
     ▼
Django Handler
     │  包装成 response
     ▼
WSGI/ASGI Server
     │
     ▼
浏览器 (收到响应)

从图中可以看到,主要分为四大阶段:

  1. 请求进入服务端:浏览器发起请求,经过 WSGI/ASGI 服务器(如 Gunicorn、Uvicorn)。

  2. Django 接管请求 :Django 的 WSGIHandlerASGIHandler 处理请求,调用 get_response()

  3. URL 匹配 :Django 根据 ROOT_URLCONF 中配置的 urlpatterns,递归匹配 URLPatternURLResolver

  4. 执行视图 :找到对应的视图函数,执行逻辑并返回 HttpResponse,最终由服务器返回给浏览器。


2. URL 的注册方式

project/urls.py 中,我们通常会写:

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

urlpatterns = [
    path("hello/", views.hello_view),  # URLPattern
    path("blog/", include("blog.urls")),  # URLResolver
]
  • URLPattern

    单一的 URL → 对应一个视图函数。例如 path("hello/", views.hello_view)

  • URLResolver

    路由分发器,可以把一部分路由交给子应用。例如 include("blog.urls")


3. URL 递归匹配机制

Django 的路由匹配是 递归 的:

  • 请求 /hello/

    • urlpatterns 中直接找到 hello/views.hello_view
  • 请求 /blog/list/

    • urlpatterns 匹配到 path("blog/", include("blog.urls"))

    • 进入 blog/urls.py

    • 在子路由里找到 path("list/", views.blog_list)

这种递归设计让 Django 项目可以方便地 模块化拆分路由


4. 示例:完整执行过程

假设我们在 views.py 中写了:

python 复制代码
from django.http import HttpResponse

def hello_view(request):
    return HttpResponse("Hello Django!")

再在 urls.py 中注册:

python 复制代码
urlpatterns = [
    path("hello/", hello_view),
]

那么访问 http://127.0.0.1:8000/hello/ 时,执行过程如下:

  1. 浏览器发起请求

  2. Django Handler 接收请求

  3. URLResolver 匹配到 hello/

  4. 调用 hello_view(request)

  5. 返回 HttpResponse("Hello Django!")

  6. 浏览器展示响应内容


5. 总结

本文介绍了 Django URL 注册与请求处理的完整流程,核心要点如下:

  1. Django URLConf 由 URLPattern 和 URLResolver 组成

    • URLPattern:路由到单一视图函数

    • URLResolver:通过 include() 分发到子应用

  2. Django URL 匹配是递归的

    支持项目模块化,方便维护大型应用。

  3. 请求执行链路清晰

    浏览器请求 → WSGI/ASGI → Django Handler → URLResolver → 视图 → HttpResponse → 浏览器。

相关推荐
2401_8685347812 小时前
MATLAB:车牌识别
python·django
独码侠19 小时前
Dify 知识库索引(中):打开源码,拆穿关于“经济索引”的三个谣言
后端·python·django·embedding·知识库·索引·dify
叫我王富贵i2 天前
0基础学Django
后端·python·django
2401_868534783 天前
综合脚本实战!自动备份、清日志、服务器巡检
python·django
weixin_BYSJ19873 天前
springboot酒店管理系统--附源码27436
java·spring boot·python·随机森林·贪心算法·eclipse·django
vx-程序开发4 天前
django医院预约挂号系统---附源码23353
java·javascript·spring boot·python·eclipse·django·php
weixin_BYSJ19874 天前
springboot医疗信息管理系统---附源码17465
java·javascript·spring boot·python·django·flask·php
vx-程序开发4 天前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
John jj5 天前
拆解 Telegram 群组频道收录市场:三类方案,一个可运行的评分模型,目前TG中文人工评分加模型评分机制——LetsTG收录“快速”、“无门槛”
大数据·后端·python·深度学习·搜索引擎·django·全文检索
2401_868534785 天前
论信息系统安全保障规划与设计
python·django