DjangoBlog学习案例:掌握Django MVT架构与多应用协作实践

本仓库为课程学习用途:参考 Gitee 上的 DjangoBlog 案例进行代码阅读与结构分析,重点理解 Django 的 MVT(Model / View / Template)分层与多应用组织方式。

从这个案例学到什么

  • Django 项目如何拆分为多个 app,并通过项目级配置把它们"组装"成一个完整网站
  • 一次 HTTP 请求如何从 URL 进入 View,再到 Model 取数,最后由 Template 渲染页面
  • Django 常见工程要素:Admin 后台、表单、中间件、模板标签、静态资源、国际化

项目结构概览

复制代码
DjangoBlog/
├─ manage.py                  # Django 管理入口
├─ requirements.txt           # Python 依赖
├─ djangoblog/                # 项目级配置(类似"站点骨架")
│  ├─ settings.py             # 全局配置(数据库/缓存/中间件/已安装应用等)
│  ├─ urls.py                 # 项目级路由入口,分发到各 app
│  ├─ wsgi.py                 # WSGI 部署入口
│  └─ plugin_manage/          # 插件系统:加载器、钩子、插件基类
├─ blog/                      # 博客核心业务(文章/分类/标签/搜索/页面渲染)
├─ accounts/                  # 用户与账号体系(自定义用户、登录注册等)
├─ comments/                  # 评论与回复
├─ oauth/                     # 第三方登录(OAuth)适配
├─ servermanager/             # 运维与接口能力(包含 api 子模块)
├─ plugins/                   # 可插拔插件(暗黑模式/SEO/阅读时长/浏览统计等)
├─ templates/                 # 模板目录(页面 UI)
├─ locale/                    # 多语言翻译文件
└─ deploy/                    # 部署相关(docker-compose/nginx/k8s 等)


技术栈与依赖(从代码结构角度理解)

  • 运行时:Python + Django
  • 数据库:默认 MySQL(djangoblog/settings.py)),也可以通过环境变量切换(用于开发/学习)
  • 模板与静态:Django Template + app 内 static/,页面模板集中在 templates
  • 搜索:Haystack(统一搜索 API)+ Whoosh(本地索引)/ Elasticsearch(可选)
  • 插件扩展:djangoblog/plugin_manage/ 提供加载器与钩子;plugins/ 目录放具体插件实现
  • 其他:OAuth 第三方登录、评论系统、运维管理 API 等分散在各 app

MVT 在本项目中分别做什么

Model(数据层)

  • 位置:各应用的 models.py
  • 职责:定义数据表结构与业务实体(文章、分类、标签、评论、用户等),并通过 ORM 完成增删改查。
  • 特点:本项目将不同业务拆分成多个 Django app,每个 app 自己维护模型与迁移文件(migrations/)。

View(业务/控制层)

  • 位置:各应用的 views.py
  • 职责:接收请求、组织业务逻辑、查询/更新模型、选择模板并返回响应。
  • 典型流程:URL 命中视图 → 读取/写入 Model → 将数据交给 Template 渲染 → 返回 HTML 或 JSON。

Template(表现层)

  • 位置:项目根目录的 <templates> 以及各 app 的模板片段
  • 职责:负责页面结构与展示(列表页、详情页、评论区、登录页等),通过 Django 模板语言渲染上下文数据。
  • 配合:静态资源(CSS/JS/图片)主要位于各 app 的 static/ 目录以及 plugins/ 的静态文件目录。

一次请求在本项目中的典型流转

以"访问首页/文章列表"为例:

  1. 入口:Django 通过 <manage.py> 启动,加载 DJANGO_SETTINGS_MODULE 指向的配置文件(见 <djangoblog/settings.py>)
  2. 路由:请求先进入项目级路由 <djangoblog/urls.py>,再分发到各 app 的 urls.py
  3. 视图:例如 blog 的列表/详情类视图在 <blog/views.py> 中,负责组织业务逻辑与分页、缓存、搜索等
  4. 数据:视图从 blog/models.pyArticle/Category/Tag 等模型查询数据(ORM)
  5. 模板:视图渲染 <templates> 下对应页面(例如文章列表/详情模板),模板中可能通过 templatetags 引入额外展示逻辑
  6. 插件:在文章渲染等关键节点,会触发钩子(hook),让 plugins/ 里的扩展功能介入但不改动核心业务

路由与应用协作方式

  • 项目入口路由:djangoblog/urls.py 统一接入,将不同 URL 前缀分发到各 app 的 urls.py
  • 应用内部路由:例如 blog/urls.pycomments/urls.py 定义本 app 的路径与视图映射
  • 多应用依赖:blog 页面通常会组合 commentsoauthplugins 的能力(例如在文章详情页渲染评论区、展示第三方登录入口、执行插件钩子)

主要模块职责

  • djangoblog/(项目级):站点"总装配"
    • settings.py:Installed Apps、数据库、缓存、模板、日志等全局配置
    • urls.py:总路由,分发到各 app
    • plugin_manage/:插件系统核心(加载 + 钩子 + 插件基类)
  • blog/(核心业务):文章、分类、标签、侧边栏、站内搜索入口、页面渲染
  • accounts/:自定义用户模型、登录注册/找回密码等账号相关能力
  • comments/:评论提交、回复、树状展示、(可选)通知等
  • oauth/:第三方登录对接(不同平台的授权/回调处理与账号绑定)
  • servermanager/:偏管理/运维的功能聚合,含对外 API 模块(servermanager/api/
  • plugins/:可插拔特性(例如暗黑模式、SEO、阅读时间、浏览次数统计、外链处理等)

数据库与迁移

  • 每个 app 的 migrations/ 记录数据库变更步骤;执行 migrate 时会按顺序创建/修改表结构
  • 业务实体一般在 models.py:例如文章模型、评论模型、用户模型等
  • 后台管理一般在 admin.py 注册模型,使其在 Django Admin 后台可管理

Template 相关:模板标签与上下文

  • 模板目录在 templates,业务 app 会提供模板片段(例如评论区/侧边栏组件)
  • templatetags/:自定义模板标签,让模板中可以更方便地获取数据或渲染组件
  • context_processors.py:把全局需要的变量注入模板上下文(例如 SEO/站点配置等)

搜索功能是怎么嵌入的

  • 项目引入 Haystack:给 View 提供统一的 SearchView 与索引管理命令
  • 索引定义:通常由 search_indexes.pydocuments.py 这类文件描述"哪些字段参与搜索"
  • 后端实现:可以使用 Whoosh(本地索引,适合学习)或 Elasticsearch(适合更大规模)

插件系统

插件的目的:把"可选功能"从核心业务中拆出去,做到解耦、可开关、易扩展。

  • 插件入口:plugins/<plugin_name>/plugin.py
  • 加载过程:项目启动时由 djangoblog 的 app 配置触发加载,再由 plugin_manage/loader.py 扫描并初始化插件
  • 工作方式:核心业务在关键位置触发钩子(hook),插件通过注册回调参与渲染或扩展逻辑

学习项目的原地址:https://github.com/liangliangyy/DjangoBlog

相关推荐
ai产品老杨2 小时前
终结协议孤岛:基于GB28181/RTSP融合网关的多品牌设备统一接入与边缘推流方案
人工智能·docker·架构·kubernetes·音视频
李昊哲小课2 小时前
NumPy 完整学习笔记
笔记·python·学习·数据分析·numpy
nonono2 小时前
深度学习——SETR(Segmentation Transformer)学习(2020.12)
深度学习·学习·transformer
醉酒柴柴2 小时前
word创建样式以后应用于所有新文件
开发语言·学习·c#·word
IT 行者2 小时前
Claude Code Viewer: 打造 Web 端 Claude Code 会话管理利器
前端·人工智能·python·django
蛋白界小百灵2 小时前
【卡梅德】生物带您学习分子钓鱼术:噬菌体展示技术实验操作解析
学习
糖果店的幽灵3 小时前
【大模型】大模型学习总结之机器学习 - 1.基础知识
人工智能·学习·机器学习
Hello.Reader3 小时前
深入理解学习率调度器原理、公式与 PyTorch 实战
人工智能·pytorch·学习
码喽7号3 小时前
Springboot学习五:MybatisPlus的快速上手
spring boot·学习·spring