本仓库为课程学习用途:参考 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/的静态文件目录。
一次请求在本项目中的典型流转
以"访问首页/文章列表"为例:
- 入口:Django 通过 <manage.py> 启动,加载
DJANGO_SETTINGS_MODULE指向的配置文件(见 <djangoblog/settings.py>) - 路由:请求先进入项目级路由 <djangoblog/urls.py>,再分发到各 app 的
urls.py - 视图:例如
blog的列表/详情类视图在 <blog/views.py> 中,负责组织业务逻辑与分页、缓存、搜索等 - 数据:视图从
blog/models.py的Article/Category/Tag等模型查询数据(ORM) - 模板:视图渲染 <templates> 下对应页面(例如文章列表/详情模板),模板中可能通过
templatetags引入额外展示逻辑 - 插件:在文章渲染等关键节点,会触发钩子(hook),让
plugins/里的扩展功能介入但不改动核心业务
路由与应用协作方式
- 项目入口路由:
djangoblog/urls.py统一接入,将不同 URL 前缀分发到各 app 的urls.py - 应用内部路由:例如
blog/urls.py、comments/urls.py定义本 app 的路径与视图映射 - 多应用依赖:
blog页面通常会组合comments、oauth、plugins的能力(例如在文章详情页渲染评论区、展示第三方登录入口、执行插件钩子)
主要模块职责
djangoblog/(项目级):站点"总装配"settings.py:Installed Apps、数据库、缓存、模板、日志等全局配置urls.py:总路由,分发到各 appplugin_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.py或documents.py这类文件描述"哪些字段参与搜索" - 后端实现:可以使用 Whoosh(本地索引,适合学习)或 Elasticsearch(适合更大规模)
插件系统
插件的目的:把"可选功能"从核心业务中拆出去,做到解耦、可开关、易扩展。
- 插件入口:
plugins/<plugin_name>/plugin.py - 加载过程:项目启动时由
djangoblog的 app 配置触发加载,再由plugin_manage/loader.py扫描并初始化插件 - 工作方式:核心业务在关键位置触发钩子(hook),插件通过注册回调参与渲染或扩展逻辑