为什么要自己搭个博客?
写代码久了,总想找个地方记点什么。
以前试过各种现成的博客平台——CSDN太杂,知乎太长,公众号又太封闭。代码片段、技术心得、项目踩坑、偶尔的生活碎碎念,散在十几个地方,自己回头看都费劲。
我需要一个完全属于自己的地方:能贴代码、能传文件、能随时改样式、能按自己习惯排版。最重要的是,所有内容都在自己手里。
刚好最近在折腾Python Web,心想不如直接动手搭一个。
技术选型与实现思路
Flask:为什么是它?
轻量,够用,可掌控。
之前考虑过Django,功能全,但太重。也看过FastAPI,异步性能强,但我的需求里没多少高并发场景。Flask刚刚好——一个文件就能跑起来,路由、模板、静态文件都自带了,扩展性又强,想加什么功能自己写就行。
路由清晰:@app.route 一贴,一个页面就出来了。
模板继承:base.html 定好框架,其他页面继承,改样式统一改。
中间件少:没有ORM,没有Admin后台,没有表单验证——这些我暂时都不需要,反而省心。
文章存储:为什么用文件而不是数据库?
简单,直观,易备份。
一开始想过上SQLite,甚至MySQL。但仔细一想:文章这种东西,读多写少,结构固定,为什么要用数据库?
现在这样做:
-
每篇文章一个
.md文件,放在docs/文件夹里。 -
文章元信息(标题、作者、时间)存在
articles.json里。 -
需要列表?读json。需要内容?读md文件。
好处:
-
备份方便:
tar -czf blog_backup.tar.gz docs/ articles.json,完事。 -
迁移简单:整个文件夹拷走,到新服务器一解压就能跑。
-
可读性强:文章就是纯文本,用任何编辑器都能打开看。
-
版本控制友好:Git直接跟踪文件变化,谁改了哪篇文章一目了然。
代价:
-
文章多了之后,json文件可能会大(但几千篇以内完全不是问题)。
-
没有复杂的查询功能(但我也不需要按标签、按时间范围搜索——至少现在不需要)。
Markdown:为什么选它?
写起来快,看起来干净,转换简单。
写技术文章,经常要贴代码、插图片、加链接。用HTML写太累,用富文本编辑器又不好控制样式。
Markdown正好:
-
代码块用
```python包裹,自带高亮。 -
图片
,简洁明了。 -
标题
##、列表-、加粗**,手不离键盘就能排版。
后端用 python-markdown 库一转,直接变HTML。样式用Tailwind CSS一套,前后一致。
文件上传:为什么支持这么多格式?
“博客”不只是文字。
有时候想贴张截图,有时候想传个演示视频,有时候想分享个PDF文档。如果每次都要先传到图床、视频站、网盘,再贴链接,太麻烦了。
所以直接内置了文件上传:
-
图片:png、jpg、webp等,自动带时间戳防重名。
-
视频:mp4、webm,可以直接在文章里播放。
-
音频:mp3、wav,适合播客类内容。
-
文档:pdf、doc、txt,方便分享资料。
-
压缩包:zip、rar,用于项目源码打包。
上传逻辑:
-
前端用
FormData+XMLHttpRequest带进度条。 -
后端检查扩展名,用
secure_filename防路径遍历。 -
存到
uploads/目录,返回可直链的URL。 -
文章里直接用
引用。
主题系统:为什么做12套渐变?
“好看”很重要,但“常换常新”更重要。
写代码看久了黑白界面,总想换个颜色。但大多数博客主题一套用到底,看久了腻。
所以做了这个主题系统:
-
12套预设渐变:从“金秋落叶”到“深蓝商务”,从“薄荷森林”到“紫橙渐变”。
-
即时切换:点一下,整个页面背景、卡片玻璃态、文字颜色全变。
-
本地保存:
localStorage记住你上次选的,下次打开还是它。 -
快捷键支持:Ctrl+T 开菜单,数字键1~12直接切,0键随机换。
技术实现:
-
每个主题是一套CSS类,比如
theme-1到theme-12。 -
glass-effect类根据当前主题调整透明度和边框颜色。 -
text-theme类根据背景亮度自动选白色或黑色文字。
为什么是渐变不是纯色?
-
渐变更有层次感,视觉不单调。
-
背景的深浅变化能让前景内容更突出。
-
可以通过调整渐变角度和颜色,模拟“早晨/黄昏/夜晚”的氛围。
管理员系统:为什么这么简单?
只有我一个人用,不需要复杂权限。
登录 → 验证密码哈希 → 给session → 进后台。
退出 → 清session → 回首页。
密码安全:
-
明文密码绝不存储。
-
前端POST到后端,后端用SHA256哈希后与预设哈希比对。
-
哈希值写在代码里(因为就我一个用户),泄露了也不怕彩虹表(足够复杂)。
后台功能:
-
写文章:标题+Markdown内容,一键发布。
-
传文件:拖拽上传,带进度条,自动复制链接。
-
管文章:列表预览,直接删除(慎用)。
-
草稿自动保存:
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错误。
-
配置集中写在开头,常量用大写。
-
路由按功能分组,注释写清楚用途。
未来可能(或不)添加的功能
可能会加:
-
RSS订阅:标准格式,方便读者跟踪。
-
文章标签:手动打几个tag,方便分类查找。
-
访问统计:简单的
access.log分析,看哪些文章有人看。 -
暗黑模式跟随系统:检测
prefers-color-scheme,自动切主题。
大概率不加:
-
评论系统:维护成本高,且容易引战。
-
用户系统:不想管理账号密码。
-
全文搜索:文章少的时候,浏览器Ctrl+F就够了。
-
后台富文本编辑器:Markdown写惯了,WYSIWYG反而别扭。
绝对不加:
-
第三方登录:微信/QQ/GitHub登录——没必要。
-
广告系统:不靠这个赚钱。
-
社交分享按钮:想分享的人自然知道复制链接。
-
弹窗订阅:讨厌这种东西,不会自己做。
写在最后
这个博客从零到上线,大概花了一个周末。
代码总行数不到500行(不含HTML/CSS)。
但跑起来那一刻,感觉比写完一个万行项目还舒服。
它不是最强大的,也不是最漂亮的,但它完全是我的。
每一个颜色是我选的,每一个功能是我写的,每一个决定是我做的。
它可能会长期停留在现在的样子,也可能会在某天突发奇想加个新功能。
但无论如何,它都在那里,安静地等着我写下一点什么。
就像书房里那张旧书桌,不豪华,但顺手。
这就够了。
后记:这篇介绍就是在这个博客的后台写的。从写代码到写文章,同一个环境,同一种体验。这大概就是自建博客的意义——你建造它,然后使用它,然后它成为你工作流的一部分。
附录:后台界面:
