当前位置: 首页 > news >正文

Django视图与路由全解析:从URL到页面,一篇讲透

你是不是经常搞不清:

  • 用户输入一个网址,Django是怎么找到对应的页面的?
  • urls.py 和 views.py 到底怎么配合工作?
  • 为什么有时候反向解析会报错?

别担心!今天我们就来彻底拆解 Django 的视图与路由系统,用最通俗的、最清晰的逻辑,带你从“看不懂”到“原来如此”。

无论你是刚入门的小白,还是想巩固基础的开发者,这篇文章都能让你对 Django 的请求处理流程有系统性、实战级的理解


 一、Django请求处理流程总览

想象一下,用户在浏览器里输入一个网址(比如 http://example.com/blog/article/1/),Django 是如何一步步把这个请求变成网页显示给用户的?

整个过程就像一场“快递派送”:

用户请求 → URL路由匹配 → 找到视图函数 → 视图处理数据 → 返回响应

我们来一步步拆解。


二、URL路由配置:网站的“导航地图”

1. 什么是URL路由?

from django.urls import path
from . import viewsurlpatterns = [path('hello/', views.hello, name='hello'),path('articles/', views.article_list, name='article_list'),
]
解释:

这就像是你家小区的“门牌号地图”。
Django 看到 /hello/ 这个网址,就知道该去调用 views.hello 这个函数来处理。

  • path('hello/', ...):这是网址路径。
  • views.hello:这是处理这个网址的“快递员”(视图函数)。
  • name='hello':给这个路由起个名字,方便以后“反向查找”。

2. 路径转换器:带参数的URL

path('article/<int:pk>/', views.article_detail, name='article_detail'),
解释:
  • <int:pk>:表示这里要接收一个整数,变量名叫 pk(主键)。
  • 比如访问 /article/123/,Django 会自动把 123 提取出来,传给视图函数。

常用转换器:

  • <int:xxx>:整数
  • <str:xxx>:字符串(不能包含 /
  • <slug:xxx>:短标签(字母、数字、连字符)
  • <uuid:xxx>:UUID

3. 包含其他URLconf:模块化管理

# project/urls.py
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('blog/', include('blog.urls')),  # 把 /blog/ 下的所有请求交给 blog 应用处理
]
# blog/urls.py
from django.urls import path
from . import viewsapp_name = 'blog'
urlpatterns = [path('article/<int:pk>/', views.article_detail, name='article_detail'),
]
解释:

这就像是“分包快递”。
主路由(project/urls.py)负责大方向(比如所有 /blog/ 开头的请求),然后转交给 blog 应用的 urls.py 去精细处理。

好处:项目结构清晰,不同App可以独立开发。


4. 命名空间(namespace):解决重名问题

问题来了:

如果两个App都有叫 index 的路由,怎么办?

# appA/urls.py
path('', views.index, name='index')# appB/urls.py
path('', views.index, name='index')

如果在模板里写 {% url 'index' %},Django 不知道你要哪个!

解决方案:使用命名空间
# project/urls.py
urlpatterns = [path('blog/', include('blog.urls', namespace='blog')),path('shop/', include('shop.urls', namespace='shop')),
]
# blog/urls.py
app_name = 'blog'  # 必须和 namespace 一致
urlpatterns = [path('', views.index, name='index'),
]
解释:

这就像是给每个App贴上“标签”:

  • blog:index → 博客应用的首页
  • shop:index → 商城应用的首页

在模板中这样用:

<a href="{% url 'blog:index' %}">博客首页</a>
<a href="{% url 'shop:index' %}">商城首页</a>

核心规则

  • 主路由用 namespace='blog'
  • 子路由用 app_name = 'blog'
  • 反向解析时用 'blog:index'

5. 反向解析:不要硬编码URL!

from django.urls import reverse# 在视图中
url = reverse('blog:article_detail', args=[123])
# 结果: /blog/article/123/# 在模板中
{% url 'blog:article_detail' article.pk %}
解释:

反向解析就是:“我知道路由的名字,让我自己算出网址是多少”。

为什么重要? 如果你把 /blog/article/<int:pk>/ 改成 /post/<int:pk>/,只要路由名不变,所有 reverse('blog:article_detail', ...) 的地方都会自动更新,不用到处改代码!


三、视图函数:真正的“业务处理中心”

1. 什么是视图函数?

from django.http import HttpResponsedef hello(request):return HttpResponse('Hello, Django!')
解释:

视图函数就是处理请求的“工人”。它接收一个 request 对象(包含用户请求信息),然后返回一个 HttpResponse 对象(包含要返回的内容)。

关键点

  • 第一个参数必须是 request
  • 必须返回一个 HttpResponse 或其子类

2. 渲染模板:返回HTML页面

from django.shortcuts import renderdef article_detail(request, pk):article = get_object_or_404(Article, pk=pk)return render(request, 'article_detail.html', {'article': article})
解释:
  • render():快捷函数,帮你把数据填充到HTML模板,生成最终的网页。
  • get_object_or_404():如果找不到文章,直接返回404错误页面,不用手动判断。

3. 返回错误视图

from django.http import HttpResponseNotFound
from django.shortcuts import get_object_or_404def page_not_found(request):return HttpResponseNotFound('Page not found!')def article_detail(request, pk):article = get_object_or_404(Article, pk=pk)  # 自动处理404return render(request, 'article_detail.html', {'article': article})
解释:
  • HttpResponseNotFound:返回404状态码 + 自定义内容。
  • get_object_or_404:Django贴心为你写的快捷方式,一行代码搞定“查不到就404”。

4. 异步视图(高级)

import asyncio
from django.http import HttpResponseasync def async_view(request):await asyncio.sleep(1)return HttpResponse('Hello from async world!')
解释:

普通视图是“同步”的,一次只能处理一个请求。
异步视图可以“同时处理多个请求”,适合高并发场景(比如聊天室、实时通知)。

注意:需要搭配 ASGI 服务器(如 Daphne),不能用 runserver 测试性能。


四、快捷函数:让开发更轻松

Django 提供了很多“懒人函数”,让你少写代码:

函数作用示例
render()渲染模板return render(request, 'page.html', context)
redirect()重定向return redirect('blog:index')
get_object_or_404()查对象,查不到就404book = get_object_or_404(Book, pk=1)
get_list_or_404()查列表,查不到就404books = get_list_or_404(Book.objects.filter(...))

五、本章总结:Django视图与路由核心要点

概念作用关键点
urlpatterns定义URL映射列表,按顺序匹配
路径转换器接收URL参数<int:pk><str:name>
include()模块化路由主路由分发到App
命名空间解决路由重名namespace + app_name
反向解析动态生成URLreverse() 和 {% url %}
视图函数处理请求接收 request,返回 response
render()返回HTML填充模板上下文
get_object_or_404安全查询自动处理404

六、动手实践

  1. 创建一个 blog App,并注册到 INSTALLED_APPS
  2. 配置主路由,将 /blog/ 映射到 blog.urls
  3. 在 blog/urls.py 中定义
    • 首页:/ → views.index
    • 文章详情:/article/<int:pk>/ → views.detail
  4. 使用命名空间,确保路由名称唯一。
  5. 在视图中使用 get_object_or_404 查询文章。
  6. 在模板中使用 {% url %} 反向解析 生成链接。

总结

Django 的视图与路由系统,就像是网站的“神经系统”——
路由是神经末梢,负责接收信号;
视图是大脑,负责处理并做出反应。

只要你掌握了这套机制,就能轻松构建任何复杂的 Web 应用!

http://www.dtcms.com/a/477475.html

相关文章:

  • 推荐系统实战:python新能源汽车智能推荐(两种协同过滤+Django 全栈项目 源码)计算机专业✅
  • 数据结构二叉树——层序遍历 扩展二叉树的左视图
  • .NET Core + Nginx服务器零基础部署全流程(附资源)
  • 吴江区经济开发区规建设局网站手机app如何开发制作
  • excel中关联word邮件合并使用
  • const string getWord() ;和 string getWord() const ;是一样的效果吗
  • 语音控制 APP 开发:唤醒率 99% 的实现
  • Linux操作系统-进程(三)
  • electron中进程线程之间通信方式
  • wordpress 原图查看贵港seo
  • idea生成数据集调研
  • 深圳网站制作就找兴田德润安徽省建设厅网站资料下载
  • Java外功精要(3)——配置文件和mybatis
  • 2024年最新技术趋势分析:AI、前端与后端开发新动向
  • kanass入门到实战(20) - 项目负责人如何使用kanass驾驭项目
  • 无需公网 IP:神卓 K900 实现海康摄像头异地观看的两种简单方法
  • (19)100天python从入门到拿捏《多线程》
  • KVM-QEMU 的完整工作流程案例解析
  • 【LeetCode】69. x 的平方根
  • C语言入门教程(第6讲):函数——让程序学会“分工合作”的魔法
  • 福建定制网站开发泰安一级的企业建站公司
  • 公司要建立网站要怎么做太原优化型网站建设
  • 开源 C++ QT QML 开发(十七)进程--LocalSocket
  • 2.CSS3.(3).html
  • 【MQ】RabbitMQ:架构、工作模式、高可用与流程解析
  • 零基础学AI大模型之大模型修复机制:OutputFixingParser解析器
  • 单个服务器部署多个rabbitmq
  • 银行资产管理系统核心业务架构设计
  • 面向快餐店的全程无人化自动化餐厅深度研究方案
  • 开源 C++ QT QML 开发(十八)多媒体--音频播放