DjangoBlog 个人博客项目架构文档

技术分享 2026-06-30 206
预计阅读时间:11 分钟

DjangoBlog 个人博客项目架构文档

基于 liangliangyy/DjangoBlog 定制
项目路径: /home/devil/projects/djangoblog


一、项目概述

DjangoBlog 是一个基于 Django 5.2 的现代化个人博客系统,支持后台管理(Admin)全功能内容管理,可直接在网页上完成文章、分类、标签、友链、侧边栏等内容的新增、编辑和删除。

核心能力矩阵

功能 说明
文章管理 增删改查、Markdown编辑器、草稿/发布、排序
分类管理 支持无限父子分类
标签管理 多对多关联
评论系统 支持 GitHub 风格 emoji 反应、嵌套回复
友链管理 支持首页/列表/文章页等位置展示
侧边栏 可自定义 HTML 内容
站点配置 标题、SEO、底部信息、评论审核等
搜索 Elasticsearch / Whoosh 双引擎
多语言 中文简体/繁体/英文
深色模式 支持系统跟随、手动切换、localStorage 持久化
OAuth 登录 GitHub / Google 等第三方登录
RSS/Atom 订阅 文章订阅输出

二、项目目录结构

djangoblog/                          # 项目根目录
├── manage.py                        # Django 项目管理入口
├── requirements.txt                 # Python 依赖
├── Dockerfile                       # Docker 部署

├── djangoblog/                      # Django 项目配置目录(主配置)
   ├── settings.py                  # 全局配置(数据库、中间件、APP)
   ├── urls.py                      # 根 URL 路由
   ├── wsgi.py                      # WSGI 部署入口
   ├── admin_site.py                # 自定义 Admin 站点
   ├── mixins.py                    # 通用 Mixin(缓存、查询优化、分页)
   ├── feeds.py                     # RSS/Atom 订阅
   ├── sitemap.py                   # 站点地图
   ├── utils.py                     # 工具函数(缓存、设置)
   ├── constants.py                 # 常量定义
   └── blog_signals.py              # 信号处理

├── blog/                            # 博客核心 APP
   ├── models.py                    # 数据模型(Article/Category/Tag/Links/SideBar)
   ├── views.py                     # 视图(首页/文章详情/分类/标签/归档)
   ├── urls.py                      # 博客 URL 路由
   ├── admin.py                     # Admin 管理配置
   ├── forms.py                     # 表单
   ├── middleware.py                # 中间件
   ├── context_processors.py        # 上下文处理器
   ├── documents.py                 # ES 文档映射
   ├── search_indexes.py            # 搜索索引
   ├── templatetags/                # 自定义模板标签
      └── blog_tags.py
   ├── management/commands/         # 管理命令
      ├── build_index.py           # 重建搜索索引
      ├── clear_cache.py           # 清除缓存
      └── create_testdata.py       # 创建测试数据
   └── static/blog/                 # 博客静态资源

├── accounts/                        # 用户认证 APP
   ├── models.py                    # BlogUser 模型(继承 AbstractUser)
   ├── views.py                     # 登录/注册/密码重置等视图
   ├── forms.py                     # 用户表单
   └── user_login_backend.py        # 自定义登录后端(邮箱/用户名)

├── comments/                        # 评论 APP
   ├── models.py                    # Comment / CommentReaction 模型
   ├── views.py                     # 评论提交/展示视图
   └── utils.py                     # 评论工具(IP获取、UA解析)

├── oauth/                           # OAuth 第三方登录 APP
   ├── models.py                    # OAuthConfig / OAuthUser
   ├── oauthmanager.py              # OAuth 管理器(GitHub/Google/微信)
   └── views.py                     # 认证回调处理

├── servermanager/                   # 服务器管理 APP
   ├── api/                         # API 接口
      ├── blogapi.py               # 博客 API(搜索/分类/最近文章)
      └── commonapi.py             # 通用 API
   ├── robot.py                     # 微信机器人
   └── models.py                    # Commands / EmailSendLog

├── owntracks/                       # 位置追踪 APP
   └── models.py                    # OwnTrackLog

├── plugins/                         # 插件系统
   ├── article_copyright/           # 文章版权声明
   ├── article_recommendation/      # 文章推荐
   ├── external_links/              # 外部链接处理
   ├── image_lazy_loading/          # 图片懒加载
   ├── reading_time/                # 阅读时间估算
   ├── seo_optimizer/               # SEO 优化
   ├── view_count/                  # 阅读计数
   └── cloudflare_cache/            # Cloudflare 缓存刷新

├── djangoblog/plugin_manage/        # 插件管理框架
   ├── hook_constants.py            # 钩子常量
   ├── hooks.py                     # 钩子注册/触发
   └── loader.py                    # 插件加载器

├── frontend/                        # 前端资源(Vite + Tailwind + Alpine.js)
   ├── package.json                 # Node.js 依赖
   ├── vite.config.js               # Vite 构建配置
   ├── tailwind.config.js           # Tailwind CSS 配置
   ├── src/                         # 前端源码
      ├── main.js                  # 入口文件
      ├── styles/main.css          # 全局样式
      └── components/              # 组件
          ├── navigation.js        # 导航栏
          ├── darkMode.js          # 深色模式
          ├── backToTop.js         # 回到顶部
          ├── codeCopy.js          # 代码复制
          ├── imageLightbox.js     # 图片灯箱
          ├── commentSystem.js     # 评论系统
          └── reactionPicker.js    # emoji 反应选择器

├── templates/                       # Django 模板
   ├── share_layout/                # 全局布局
      ├── base.html                # 基础模板
      ├── nav.html                 # 导航栏
      └── footer.html              # 页脚
   ├── blog/                        # 博客页面模板
      ├── article_index.html       # 首页文章列表
      ├── article_detail.html      # 文章详情页
      └── article_archives.html    # 归档页面
   ├── account/                     # 账户模板
   ├── comments/                    # 评论模板
   ├── oauth/                       # OAuth 模板
   └── search/                      # 搜索模板

├── uploads/                         # 上传文件目录(媒体)
└── locale/                          # 国际化翻译文件
    ├── zh_Hans/                     # 简体中文
    ├── zh_Hant/                     # 繁体中文
    └── en/                          # 英文

三、核心数据模型

3.1 文章 (Article)

字段 类型 说明
title CharField(200) 文章标题,唯一
body MDTextField Markdown 正文
pub_time DateTimeField 发布时间
status CharField(1) d=草稿, p=已发布
comment_status CharField(1) o=开放, c=关闭
type CharField(1) a=文章, p=页面
views PositiveIntegerField 阅读数
author ForeignKey(BlogUser) 作者
category ForeignKey(Category) 分类
tags ManyToManyField(Tag) 标签
article_order IntegerField 排序权重
show_toc BooleanField 是否显示目录

3.2 分类 (Category)

字段 类型 说明
name CharField(30) 分类名称
parent_category ForeignKey(self) 父分类(支持无限级)
slug SlugField URL 友好标识

3.3 标签 (Tag)

字段 类型 说明
name CharField(30) 标签名称
slug SlugField URL 友好标识

3.4 评论 (Comment)

字段 类型 说明
body TextField 评论内容
author ForeignKey(BlogUser) 评论者
article ForeignKey(Article) 所属文章
parent_comment ForeignKey(self) 父评论(嵌套回复)
is_enable BooleanField 是否显示(审核)

3.5 站点配置 (BlogSettings) — 单例模型

字段 类型 说明
title CharField 站点标题
description CharField 站点描述
keywords CharField SEO 关键词
footer TextField 页脚 HTML
beian CharField 备案号
analytics_code TextField 统计代码
color_scheme CharField 主题配色
article_sub_max_length IntegerField 摘要截断长度
comment_need_review BooleanField 评论需审核

四、URL 路由设计

前端路由(用户可见)

/                           → 首页(文章列表)
/page/<int:page>/           → 首页分页
/article/<Y>/<M>/<D>/<id>.html → 文章详情
/category/<slug>.html       → 分类文章列表
/tag/<slug>.html            → 标签文章列表
/author/<name>.html         → 作者文章列表
/archives.html              → 文章归档
/links.html                 → 友情链接
/search                     → 全文搜索
/feed/  /rss/               → RSS 订阅
/sitemap.xml                → 站点地图

后台管理路由(管理员可见)

/admin/                     → Admin 后台首页
/admin/blog/article/        → 文章列表 + 增删改
/admin/blog/category/       → 分类管理
/admin/blog/tag/            → 标签管理
/admin/blog/links/          → 友链管理
/admin/blog/sidebar/        → 侧边栏管理
/admin/blog/blogsettings/   → 站点配置
/admin/comments/comment/    → 评论管理
/admin/account/bloguser/    → 用户管理

五、请求处理流程

用户请求 → Nginx (静态文件) / Gunicorn (动态)
         ↓
    Django WSGI
         ↓
    URL 路由 (urls.py)
         ↓
    中间件链 (Security → Session → Locale → GZip → Common → CSRF → Auth → Message)
         ↓
    View 视图 (ListView / DetailView)
         ↓
    Mixin 层 (缓存 → 查询优化 → 分页)
         ↓
    Model 查询 (select_related + prefetch_related)
         ↓
    模板渲染 (base.html + 页面模板 + 插件钩子)
         ↓
    返回 HTML 响应

六、缓存策略

缓存目标 策略 Key 模式
文章列表页 数据库缓存 + 文件缓存 index_{page}
分类列表 数据库缓存 category_{slug}_{page}
标签列表 数据库缓存 tag_{slug}_{page}
文章详情 数据库缓存 article_{id}
站点设置 数据库缓存 blog_settings
侧边栏 数据库缓存 sidebar_{name}

七、插件系统

插件通过「钩子(Hook)」机制在模板渲染时介入:

钩子 触发位置 已实现插件
article_content_hook 文章内容渲染后 版权声明、阅读时间、图片懒加载、SEO、文章推荐
article_detail_bottom_hook 文章详情页底部 文章推荐
sidebar_hook 侧边栏渲染 文章推荐
css_includes_hook 页面头部 CSS 各插件样式
js_includes_hook 页面底部 JS 各插件脚本

插件结构示例 (plugins/article_copyright/plugin.py):

class ArticleCopyrightPlugin(BasePlugin):
    def get_hooks(self):
        return {
            'article_content_hook': self.add_copyright
        }

    def add_copyright(self, context):
        # 在文章末尾添加版权声明
        ...

八、部署架构

                    ┌─────────────┐
                    │   Nginx     │  ← 反向代理 + 静态文件
                    │  (80/443)   │
                    └──────┬──────┘
                           │ proxy_pass
                    ┌──────┴──────┐
                    │  Gunicorn   │  ← Python WSGI 服务器
                    │  + gevent   │
                    └──────┬──────┘
                           │
              ┌────────────┼────────────┐
              │            │            │
       ┌──────┴─────┐ ┌───┴────┐ ┌────┴────┐
       │  MySQL 8   │ │ Redis  │ │ Elastic │
       │  (主存储)   │ │ (缓存)  │ │ (搜索)   │
       └────────────┘ └────────┘ └─────────┘

开发环境(当前使用)

组件 方案
数据库 SQLite(开发)/ MySQL(生产)
缓存 本地内存缓存(开发)/ Redis(生产)
搜索 Whoosh(开发)/ Elasticsearch(生产)
前端构建 Vite + ESBuild
CSS 框架 Tailwind CSS + Alpine.js
WSGI 服务器 Uvicorn(开发)/ Gunicorn(生产)

九、网页内容管理流程

通过 Django Admin 后台实现网页端的完整内容管理:

1. 管理员登录  /admin/
2. 进入文章列表页  查看/搜索/过滤所有文章
3. 点击新增文章」→ 使用 Markdown 编辑器 (mdEditor) 编写
   - 支持实时预览
   - 支持图片上传
   - 支持代码高亮
4. 设置分类标签排序权重发布状态
5. 保存  自动生成 slug  缓存清除  前端立即可见
6. 已有文章可随时编辑 / 删除 / 切换草稿/发布

同样流程适用于:分类、标签、友链、侧边栏、站点配置、评论审核。


十、自定义计划(后续迭代)

优先级 改造项 说明
P0 内容个性化 替换示例数据为个人博客内容(文章、分类、标签)
P0 主题定制 修改配色、Logo、导航文案、页脚信息
P1 多数据库支持 SQLite 开发 ↔ MySQL 生产环境切换
P1 前端页面美化 进一步定制 Tailwind 样式
P2 自定义域名 配置站点域名和 HTTPS
P2 评论开放 配置第三方 OAuth 登录

本文由 admin 原创,转载请注明出处。

相关推荐

暂无评论,来发表第一条评论吧

发表评论

登录 后发表评论