从零自建博客

Dvs (DvsXT)
2026-02-07 10:29:39

为什么要自己搭个博客?

写代码久了,总想找个地方记点什么。

以前试过各种现成的博客平台——CSDN太杂,知乎太长,公众号又太封闭。代码片段、技术心得、项目踩坑、偶尔的生活碎碎念,散在十几个地方,自己回头看都费劲。

我需要一个完全属于自己的地方:能贴代码、能传文件、能随时改样式、能按自己习惯排版。最重要的是,所有内容都在自己手里

刚好最近在折腾Python Web,心想不如直接动手搭一个。


技术选型与实现思路

Flask:为什么是它?

轻量,够用,可掌控。

之前考虑过Django,功能全,但太重。也看过FastAPI,异步性能强,但我的需求里没多少高并发场景。Flask刚刚好——一个文件就能跑起来,路由、模板、静态文件都自带了,扩展性又强,想加什么功能自己写就行。

路由清晰@app.route 一贴,一个页面就出来了。

模板继承:base.html 定好框架,其他页面继承,改样式统一改。

中间件少:没有ORM,没有Admin后台,没有表单验证——这些我暂时都不需要,反而省心。

文章存储:为什么用文件而不是数据库?

简单,直观,易备份。

一开始想过上SQLite,甚至MySQL。但仔细一想:文章这种东西,读多写少,结构固定,为什么要用数据库?

现在这样做:

  • 每篇文章一个 .md 文件,放在 docs/ 文件夹里。

  • 文章元信息(标题、作者、时间)存在 articles.json 里。

  • 需要列表?读json。需要内容?读md文件。

好处

  1. 备份方便tar -czf blog_backup.tar.gz docs/ articles.json,完事。

  2. 迁移简单:整个文件夹拷走,到新服务器一解压就能跑。

  3. 可读性强:文章就是纯文本,用任何编辑器都能打开看。

  4. 版本控制友好:Git直接跟踪文件变化,谁改了哪篇文章一目了然。

代价

  • 文章多了之后,json文件可能会大(但几千篇以内完全不是问题)。

  • 没有复杂的查询功能(但我也不需要按标签、按时间范围搜索——至少现在不需要)。

Markdown:为什么选它?

写起来快,看起来干净,转换简单。

写技术文章,经常要贴代码、插图片、加链接。用HTML写太累,用富文本编辑器又不好控制样式。

Markdown正好:

  • 代码块用 ```python 包裹,自带高亮。

  • 图片 ![描述](链接),简洁明了。

  • 标题 ##、列表 -、加粗 **,手不离键盘就能排版。

后端用 python-markdown 库一转,直接变HTML。样式用Tailwind CSS一套,前后一致。

文件上传:为什么支持这么多格式?

“博客”不只是文字。

有时候想贴张截图,有时候想传个演示视频,有时候想分享个PDF文档。如果每次都要先传到图床、视频站、网盘,再贴链接,太麻烦了。

所以直接内置了文件上传:

  • 图片:png、jpg、webp等,自动带时间戳防重名。

  • 视频:mp4、webm,可以直接在文章里播放。

  • 音频:mp3、wav,适合播客类内容。

  • 文档:pdf、doc、txt,方便分享资料。

  • 压缩包:zip、rar,用于项目源码打包。

上传逻辑

  1. 前端用 FormData + XMLHttpRequest 带进度条。

  2. 后端检查扩展名,用 secure_filename 防路径遍历。

  3. 存到 uploads/ 目录,返回可直链的URL。

  4. 文章里直接用 ![](/uploads/xxx.jpg) 引用。

主题系统:为什么做12套渐变?

“好看”很重要,但“常换常新”更重要。

写代码看久了黑白界面,总想换个颜色。但大多数博客主题一套用到底,看久了腻。

所以做了这个主题系统:

  • 12套预设渐变:从“金秋落叶”到“深蓝商务”,从“薄荷森林”到“紫橙渐变”。

  • 即时切换:点一下,整个页面背景、卡片玻璃态、文字颜色全变。

  • 本地保存localStorage 记住你上次选的,下次打开还是它。

  • 快捷键支持:Ctrl+T 开菜单,数字键1~12直接切,0键随机换。

技术实现

  • 每个主题是一套CSS类,比如 theme-1theme-12

  • glass-effect 类根据当前主题调整透明度和边框颜色。

  • text-theme 类根据背景亮度自动选白色或黑色文字。

为什么是渐变不是纯色?

  • 渐变更有层次感,视觉不单调。

  • 背景的深浅变化能让前景内容更突出。

  • 可以通过调整渐变角度和颜色,模拟“早晨/黄昏/夜晚”的氛围。

管理员系统:为什么这么简单?

只有我一个人用,不需要复杂权限。

登录 → 验证密码哈希 → 给session → 进后台。

退出 → 清session → 回首页。

密码安全

  • 明文密码绝不存储。

  • 前端POST到后端,后端用SHA256哈希后与预设哈希比对。

  • 哈希值写在代码里(因为就我一个用户),泄露了也不怕彩虹表(足够复杂)。

后台功能

  1. 写文章:标题+Markdown内容,一键发布。

  2. 传文件:拖拽上传,带进度条,自动复制链接。

  3. 管文章:列表预览,直接删除(慎用)。

  4. 草稿自动保存localStorage 每2秒存一次,意外关闭也不怕。

没有的功能(故意不加)

  • 多用户管理(不需要)。

  • 文章编辑历史(Git可以代劳)。

  • 评论系统(暂时不想开放互动)。

关于部署

cmd/bash

python app.py

就一行命令。 设成服务,开机自启。 本来想直接Flask裸跑,因为访问量不大。但是只有一个服务器,所以最后还是上了Nginx反代。


设计哲学:少即是多

这个博客的每一个功能,都是因为“我需要”而存在,不是因为“别人有”而添加。

不做的决定同样重要:

  • 不做评论系统:减少垃圾评论、审核、用户管理的麻烦。

  • 不做用户注册:内容为主,不需要社交功能。

  • 不做SEO优化:本意是给自己看,能搜到是缘分。(不过你用的是Bing的话....可能真能搜到。)

  • 不做移动端专门适配:Tailwind CSS默认响应式,够用。

技术栈保持极简:

  • 前端:Tailwind CSS + FontAwesome,无jQuery,无React/Vue。

  • 后端:纯Flask,无SQLAlchemy,无WTForms。

  • 存储:文件系统,无Redis,无Memcached。

  • 部署:Python + Nginx,无Docker,无K8s。

代码风格:直白胜过巧妙

  • 函数都很短,不超过50行。

  • 错误处理简单但够用:try-catch,返回json错误。

  • 配置集中写在开头,常量用大写。

  • 路由按功能分组,注释写清楚用途。


未来可能(或不)添加的功能

可能会加:

  1. RSS订阅:标准格式,方便读者跟踪。

  2. 文章标签:手动打几个tag,方便分类查找。

  3. 访问统计:简单的 access.log 分析,看哪些文章有人看。

  4. 暗黑模式跟随系统:检测 prefers-color-scheme,自动切主题。

大概率不加:

  1. 评论系统:维护成本高,且容易引战。

  2. 用户系统:不想管理账号密码。

  3. 全文搜索:文章少的时候,浏览器Ctrl+F就够了。

  4. 后台富文本编辑器:Markdown写惯了,WYSIWYG反而别扭。

绝对不加:

  1. 第三方登录:微信/QQ/GitHub登录——没必要。

  2. 广告系统:不靠这个赚钱。

  3. 社交分享按钮:想分享的人自然知道复制链接。

  4. 弹窗订阅:讨厌这种东西,不会自己做。


写在最后

这个博客从零到上线,大概花了一个周末。

代码总行数不到500行(不含HTML/CSS)。

但跑起来那一刻,感觉比写完一个万行项目还舒服。

它不是最强大的,也不是最漂亮的,但它完全是我的。

每一个颜色是我选的,每一个功能是我写的,每一个决定是我做的。

它可能会长期停留在现在的样子,也可能会在某天突发奇想加个新功能。

但无论如何,它都在那里,安静地等着我写下一点什么。

就像书房里那张旧书桌,不豪华,但顺手。

这就够了。


后记:这篇介绍就是在这个博客的后台写的。从写代码到写文章,同一个环境,同一种体验。这大概就是自建博客的意义——你建造它,然后使用它,然后它成为你工作流的一部分。

附录:后台界面:

后台界面

阅读时间约需 5分钟

使用键盘左右箭头可快速导航文章

按 Ctrl+D 收藏本页