关于

Linux 2017-01-15 40895
预计阅读时间:15 分钟

DjangoBlog - 我的Django博客系统开发历程

CI Status CodeQL codecov license Python Version Django Version

写在前面 ✨·

这个博客系统已经陪伴我走过了近十年的时光。从最初使用WordPress,到决定用Django重写,再到现在拥有完整的插件系统、深色模式、多语言支持等现代化特性,每一次迭代都记录着我的成长和思考。

在线地址: https://www.lylinux.net 开源地址: https://github.com/liangliangyy/DjangoBlog

为什么要自己写博客系统? 🤔

最开始我和大多数人一样,使用的是WordPress。WordPress功能强大,插件丰富,但随着使用的深入,我发现了一些问题:

  • PHP环境在我的VPS上部署比较麻烦
  • WordPress对于简单的需求来说有些"重"
  • 想要深度定制总是受限于主题和插件
  • 作为Python开发者,总想着"自己动手,丰衣足食"

于是,DjangoBlog诞生了。从2016年的第一个版本到现在,它已经成为一个功能完善的博客系统。

核心功能特性 ⚡

📝 写作体验

使用Markdown写作,支持代码高亮。在Mac上写好文章,直接复制到后台发布,简单高效。文章支持分类和标签,还有全文搜索功能,最近还加入了搜索结果高亮显示。

💬 评论互动

完整的评论系统,支持Markdown格式。当有人评论或回复时,会自动发送邮件通知。还支持评论审核功能,可以过滤垃圾评论。

最特别的是支持第三方账号登录,目前已接入Google、GitHub、Facebook和微博,用户可以直接使用这些账号登录评论,头像也会自动获取。

🎨 界面设计

界面设计参考了之前使用的WordPress主题,但做了现代化改进:

  • 完美适配PC和移动端
  • 支持深色模式,自动记住你的选择
  • 侧边栏展示最新文章、热门文章和标签云
  • 响应式设计,在各种设备上都有良好体验

⚡ 性能优化

  • 使用Redis缓存,访问速度快
  • 图片上传时自动压缩,节省带宽
  • CSS和JavaScript自动压缩混淆
  • 优化了首屏加载速度

🚀 部署与运维

提供完整的Docker部署方案,还支持Kubernetes。配置好CI/CD流程后,push代码就能自动部署。出现异常时会自动发送邮件提醒,让我可以及时发现问题。

版本演进历程 📅

🎯 最新版本 v2.1.0.0 (2026年1月)

这是2026年的第一个版本,距离2.0版本发布仅一个月,但带来了许多重要改进。主要变更包含50多个PR,涉及前端重构、性能优化和安全加固。

🔍 搜索系统重构

搜索功能得到了全面升级。现在搜索结果会高亮显示关键词,并且对HTML内容进行纯文本提取后再高亮,避免了HTML标签干扰。搜索界面也经过重新设计,加入了快捷入口图标,头部布局更加现代化。此外,Elasticsearch升级到8.6.1版本,搜索性能和准确度都有提升。

🌙 深色模式完善

2.0版本引入了基础的深色模式,但存在切换闪烁的问题。2.1版本对此进行了彻底重构:

  • 实现了主题切换的持久化存储,记住用户选择
  • 增加了系统主题跟随功能,可自动切换
  • 优化了CSS加载顺序,彻底解决切换时的闪烁问题
  • 调整了深色模式下的颜色对比度,阅读体验更佳

💎 前端现代化改造

引入了Vite作为前端构建工具,替换了老旧的django-compressor。这带来了几个好处:

  • 开发时热模块替换(HMR),提升开发效率
  • 更智能的代码分割和懒加载
  • 优化了字体加载策略,使用font-display: swap减少首屏渲染阻塞
  • 精简了静态资源,删除了IE兼容代码和无用的字体文件

⚡ 性能优化

基于实际运行数据进行了针对性优化:

  • 优化首屏渲染,关键CSS内联,非关键资源延迟加载
  • 添加了缓存一致性检查配置,可根据需要关闭以提升性能
  • 优化了数据库查询,为常用查询添加复合索引
  • 静态资源压缩率提升30%

🔒 安全加固

通过GitHub CodeQL扫描发现并修复了多个安全问题:

  • 修复了使用MD5等弱加密哈希算法的问题
  • 修复了URL重定向漏洞,防止开放重定向攻击
  • 增强了XSS防护,对用户输入进行更严格的过滤

🏗️ 架构改进

引入了基础视图类(base_views.py),统一了视图层的安全策略和缓存策略。这让代码更加DRY(Don't Repeat Yourself),也更容易维护。

📈 SEO优化

更新了meta标签生成逻辑,为文章、分类、标签和作者页面提供更精确的元数据,改进了搜索引擎抓取效果。

📱 移动端体验

重新设计了移动端导航菜单,优化了响应式布局,小屏幕设备的浏览体验显著提升。

🤖 AI辅助开发

这个版本还有一个有趣的里程碑:GitHub Copilot作为"贡献者"首次出现在项目中,参与了Docker工作流优化和CI/CD改进,AI辅助开发正在成为现实。

📦 依赖更新

通过Dependabot自动更新了大量依赖包,包括:

  • Django保持最新的5.2.x版本
  • Markdown库从3.5升级到3.10
  • Bleach升级到6.3.0,增强XSS防护
  • Pygments升级到2.19.2,支持更多语言高亮

🏆 v2.0.0.0 (2025年12月) - 里程碑版本

这是一个重大版本更新,历时近两年开发,合并了100多个PR,涉及架构重构、功能扩展和技术栈升级。这个版本基本上重写了大部分核心代码,是项目发展的重要分水岭。

🔧 Django 5.0 + Python 3.9

完成了技术栈的重大升级:

  • Django从4.2升级到5.0,拥抱最新特性和性能改进
  • Python最低版本提升到3.9,使用类型提示和新语法特性
  • 数据库迁移系统重构,支持更灵活的Schema变更
  • 异步视图支持,部分IO密集操作改为异步处理

🔌 插件系统架构

这是2.0版本最重要的创新。设计了一套完整的插件系统,让功能扩展变得优雅:

# 插件基类提供统一接口
class BasePlugin:
    SUPPORTED_POSITIONS = []  # 插件显示位置
    DEFAULT_PRIORITY = 100    # 优先级

    def render_position_widget(self, position, context):
        # 插件渲染逻辑
        pass

插件系统的特性:

  • 零侵入:插件独立于核心代码,放在plugins目录即可
  • 位置系统:定义了sidebar、article_bottom等多个插件位置
  • 优先级控制:插件可以指定渲染优先级
  • 钩子机制:插件可以注册到Django信号系统
  • 模板自动发现:插件可以有自己的模板和静态文件

目前已实现的内置插件:

  • 文章推荐插件:基于标签相似度推荐相关文章
  • 热门文章插件:展示阅读量最高的文章
  • 标签云插件:可视化展示所有标签

📁 目录结构重组

为了支持插件系统和更好的代码组织,对项目结构进行了重构:

djangoblog/
├── blog/                 # 核心博客应用
├── accounts/             # 用户账号系统
├── comments/             # 评论系统
├── servermanager/        # VPS管理
├── oauth/               # OAuth登录
├── djangoblog/          # 项目配置
│   ├── plugin_manage/  # 插件管理器
│   ├── base_views.py   # 基础视图
│   └── settings.py
└── plugins/             # 插件目录
    ├── article_recommend/
    ├── hot_articles/
    └── tag_cloud/

🌙 深色模式首发

实现了完整的深色主题支持:

  • 在数据库中添加了color_scheme字段存储用户偏好
  • CSS变量系统,方便主题切换
  • 自动适配用户系统主题设置
  • 所有页面和组件都适配深色模式

🌍 多语言国际化

引入了Django的i18n框架:

  • 使用gettext提取可翻译字符串
  • 提供中英文翻译文件
  • 时区感知的日期时间处理
  • URL国际化支持

虽然目前主要还是中文用户,但为未来的国际化打下了基础。

🤖 ChatGPT智能辅助

在servermanager模块集成了OpenAI API:

  • 用于智能回复微信公众号消息
  • 辅助生成文章摘要
  • 代码优化建议

这是对AI技术的一次探索性尝试。

☸️ 云原生部署

提供了完整的Kubernetes部署方案:

deploy/k8s/
├── configmap.yaml      # 配置文件
├── deployment.yaml     # 部署配置
├── service.yaml        # 服务配置
└── ingress.yaml        # 入口配置

支持:

  • 滚动更新和回滚
  • 水平扩展
  • 健康检查
  • 配置热更新

Docker镜像也进行了优化,使用多阶段构建,最终镜像大小减少40%。

✅ 评论审核系统

新增了灵活的评论审核机制:

  • 全局开关控制是否需要审核
  • 管理后台可批量审核评论
  • 评论审核后自动发送邮件通知
  • 防垃圾评论算法

💾 数据库优化

添加了多个复合索引,常见查询性能提升50%:

  • (status, pub_time) 用于文章列表查询
  • (status, views) 用于热门文章查询
  • (article, parent, enable_comment) 用于评论树查询

🧪 测试覆盖率大幅提升

新增了大量测试用例:

  • accounts模块测试覆盖率达到85%
  • blog模块测试覆盖率达到78%
  • comments模块完整测试
  • 总体测试覆盖率从40%提升到78%

🔒 安全性增强

  • 修复XSS漏洞,使用bleach清理HTML
  • 增强SQL注入防护
  • 敏感配置迁移到环境变量
  • 定期安全审计流程

🚀 CI/CD完善

  • GitHub Actions工作流优化
  • 自动部署到生产环境
  • 代码质量检查集成
  • Dependabot自动依赖更新

从1.0.0.7到2.0.0.0,代码变更超过1万行,是项目历史上最大的一次更新。

v1.0.x系列 (2021-2023)

从v1.0.0.1到v1.0.0.7,这段时间主要是稳定性改进:

  • 完善了基础的博客功能
  • 优化了OAuth登录流程
  • 改进了缓存机制
  • 增强了SEO功能
  • 修复了各种bug

早期版本 (2016-2021)

v5.0 (2018年1月): 升级到Django 2.0,增加Facebook登录,修改用户评论默认头像为OAuth获取的头像。

v4.0 (2017年9月): 集成微信公众号功能,可以用微信公众号管理VPS。

v3.0 (2017年6月): 优化OAuth功能,评论支持Markdown,上传图片自动压缩。

v2.4 (2017年4月): 支持微博登录,添加标签云,非本站链接自动添加nofollow。

v2.3 (2017年3月): OAuth登录功能上线,支持Google和GitHub。

v2.2 (2017年2月): 添加JS/CSS压缩混淆功能,集成Travis自动测试。

v2.1 (2017年2月): 修复评论bug,添加ping_baidu命令,增加评论邮件通知。

v2.0 (2017年1月): 基本功能完善,优化sitemap和feeds,修改代码高亮和Markdown解析。

v1.1 (2017年1月): 添加搜索功能,加入Memcache缓存,修复若干bug。

v1.0 (2016年12月): 第一个版本发布,实现基础博客功能。

技术选型思考 💭

为什么选择Django?

Django的"batteries included"哲学很适合快速开发博客系统。ORM、Admin、表单、认证等功能都是内置的,让我可以专注于业务逻辑。而且Python生态丰富,需要什么功能基本都能找到对应的库。

为什么不用静态博客生成器?

Hexo、Hugo这类静态博客很快,但缺少动态功能。评论、搜索、用户登录这些功能实现起来很麻烦。我需要一个有后台管理的动态博客系统。

相比WordPress的优势?

  • 更轻量,资源占用更少
  • 代码可控,想改哪里改哪里
  • 对Python开发者更友好
  • 部署更灵活,Docker、K8s都支持

当然WordPress的插件生态是它的优势,但对我来说,能够完全掌控系统更重要。

开源与分享 🌟

从第一天起,DjangoBlog就是开源的。截至目前,项目已经收获了不少Star和Fork,也有很多朋友提交了PR。

如果你也想搭建自己的博客,或者想学习Django开发,欢迎访问项目地址:

https://github.com/liangliangyy/DjangoBlog

项目采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议,可以自由使用和修改,但不能用于商业目的。

未来规划 🚀

虽然已经是一个相对完善的系统,但还有很多可以改进的地方:

  • 继续优化插件系统,让插件开发更简单
  • 改进移动端体验,考虑做一个渐进式Web应用(PWA)
  • 增加更多的主题支持
  • 考虑支持Markdown扩展语法
  • 改进搜索功能,可能会引入Elasticsearch

感谢支持 ☕

如果这个项目对你有帮助,可以考虑请我喝杯咖啡,你的支持是我持续维护的动力。

支付宝:

IMG 0207

微信支付:

IMG 0206

写在最后 💬

从WordPress到DjangoBlog,从简单的博客到现在的功能完善的系统,这个项目承载了我这些年在Web开发上的思考和实践。

博客不仅是一个展示平台,更是一个学习和成长的记录。每一次版本更新,每一个功能改进,都是对技术的探索和对用户体验的追求。

如果你正在考虑搭建自己的博客,或者对Django开发感兴趣,希望DjangoBlog能给你一些启发。欢迎Star、Fork,也欢迎提Issue和PR。

让我们一起,用代码记录生活,用技术连接世界。


项目地址: https://github.com/liangliangyy/DjangoBlog
博客地址: https://www.lylinux.net
问题反馈: https://github.com/liangliangyy/DjangoBlog/issues


如果觉得不错,请给个⭐Star支持一下!

Made with ❤️ by liangliangyy


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

相关推荐

评论

75
  1. xiaozuo

    test

  2. 杀生丸

    你这网站可以商用吗?我准备开发部署博客的商业业务,是否有法律上的风险。

  3. zhiyuanjiang

    niu

  4. jkwu3

    fwef

  5. 丑八怪。

    aaaa

发表评论

登录 后发表评论

发现更多