W weiserv
← 返回博客

用 Django 4.2 搭建个人技术站的实战笔记

用 Django 4.2 搭建个人技术站的实战笔记

把个人技术站从零搭起来不难,难的是让它稳定、可维护、可迁移。本文记录用 Django 4.2 重建站点时沉淀的几点工程经验,大多与部署和运维相关,供同样在折腾的朋友参考。

1. 配置与环境分离:一份代码,多份环境

早期把 SECRET_KEYDEBUG、数据库密码直接写死在 settings.py 里,结果本地调试和线上部署频繁串味。正确做法是把所有环境相关的值抽到环境变量:

import os
SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY", "dev-insecure")
DEBUG = os.environ.get("DJANGO_DEBUG", "False") == "True"
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": os.environ.get("DB_NAME", "weiserv"),
        "USER": os.environ.get("DB_USER", "root"),
        "PASSWORD": os.environ.get("DB_PASSWORD", ""),
        "HOST": os.environ.get("DB_HOST", "127.0.0.1"),
        "PORT": os.environ.get("DB_PORT", "3306"),
    }
}

本地开发用 python-dotenv 读取 .env,生产环境由 uWSGI 的 env = 指令注入,一套代码在两种环境间互不干扰。

2. 写操作后务必清缓存

站点用 cache_page 做了整页缓存,新文章发布后列表页和详情页一时不刷新,排查半天才定位到是缓存未失效。发布脚本里加一行 cache.clear() 即可让全站缓存失效、重新生成:

from django.core.cache import cache
cache.clear()

注意这会把缓存整体清空,流量高峰期慎用;更细粒度可用 cache.delete_pattern 只清博客相关键。

3. slug 幂等:发一次与发一百次结果一致

如果发文接口按标题自动生成 slug,重复运行会产生 xxx-2xxx-3 这类重复地址,既丑又影响 SEO。稳健做法是使用稳定 slug 先做查重,存在就跳过创建:

existing = Post.objects.filter(slug=slug).first()
if existing:
    # 已存在,跳过,保证幂等
    return
Post.objects.create(slug=slug, ...)

这样脚本无论跑多少次,线上状态都一致,也方便通过定时任务反复同步内容。

小结

Django「约定优于配置」对个人站非常友好,真正值得花心思的反而是部署、缓存、配置这些工程细节。把环境隔离、缓存失效和幂等写入发布流程,个人站就能做到「改完即发、发了即稳」。更多细节后续再逐步补充。

广告位占位 · post-inline